Ok, je suis allé complètement dans le trou du lapin sur celui-ci, mais je pense avoir une solution assez cool:
Tout d'abord, ajouter un gestionnaire d'événements à votre contexte de données qui permettra de recueillir tous le poste -Sauvegardez les signaux et masquer la méthode Dispose
afin que nous puissions appeler l'événement juste avant de disposer. (Notez que j'utilise le mot-clé new
au lieu de override
. Cela fait appeler l'événement possible.)
partial class MyDataContext
{
internal delegate void PostSaveHandler();
internal event PostSaveHandler PostSave;
// This method hides the underlying Dispose because we need to call PostSave.
public new void Dispose(bool disposing)
{
// Obviously necessary error handling omitted for brevity's sake
PostSave();
base.Dispose(disposing);
}
}
Ensuite, écrire un T4 Template qui inspecte le fichier dbml
qui génère LINQ to SQL pour vous.
<#
var dbml = XDocument.Load(@"MyDataContext.dbml");
var name = XName.Get("Type", "http://schemas.microsoft.com/linqtosql/dbml/2007");
var tables = from t in dbml.Descendants(name) select t.Attribute("Name").Value;
foreach(var table in tables)
{
#>
...
Pour chaque table de la base de données (et donc chaque classe partielle), ajoutez le partiel aux méthodes suivantes.
public partial class Foo
{
internal void OnInsert(MyDataContext db) {
PreInsert();
db.PostSave += delegate { PostInsert(); };
}
internal void OnUpdate(MyDataContext db) {
PreUpdate();
db.PostSave += delegate { PostUpdate(); };
}
internal void OnDelete(MyDataContext db) {
PreDelete();
db.PostSave += delegate { PostDelete(); };
}
partial void PreInsert();
partial void PostInsert();
partial void PreUpdate();
partial void PostUpdate();
partial void PreDelete();
partial void PostDelete();
}
// repeat for all tables
Ajoutez également un autre partial MyDataContext
via T4. Cela ajoutera des définitions aux méthodes partielles que Linq to SQL vous donne (comme mentionné par Merritt). Cachez ces fichiers dans un endroit sûr, afin que personne ne tente de les manipuler.
Votre structure de signaux est configurée. Maintenant vous pouvez écrire vos signaux. Mettez ces soit en Foo.cs
ou tous ensemble dans un fichier Signals.cs
:
partial class Foo
{
partial void PostInsert()
{
EventLog.AddEvent(EventType.FooInserted, this);
}
}
C'est un peu complexe, donc si quelque chose n'a pas de sens, s'il vous plaît laisser un commentaire et je ferai de mon mieux pour y remédier.