Ok, ich habe auf diesen einen vollständig in den Kaninchenbau gegangen, aber ich glaube, ich habe eine ziemlich coole Lösung:
Zuerst einen Event-Handler, um Ihre Daten Kontext hinzufügen, dass alle von der Post sammeln -Speichern Sie Signale und blenden Sie die Methode Dispose
aus, damit wir das Ereignis unmittelbar vor der Entsorgung aufrufen können. (Beachten Sie, dass ich das new
Schlüsselwort verwenden statt override
. Dies macht die Veranstaltung möglich anrufen.)
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);
}
}
Als nächstes schreiben einen T4 Template, die die dbml
Datei überprüft, die LINQ to SQL für Sie generiert.
<#
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)
{
#>
...
Fügen Sie für jede Tabelle in der Datenbank (und damit für jede Teilklasse) die partielle mit den folgenden Methoden hinzu.
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
Fügen Sie auch einen weiteren partial MyDataContext
über T4 hinzu. Dies wird Definitionen zu den partiellen Methoden hinzufügen, die Linq to SQL Ihnen gibt (wie Merritt erwähnt).
Verstecken Sie diese Dateien irgendwo an einem sicheren Ort, damit niemand versucht, sich mit ihnen anzulegen.
Ihr Signalframework ist eingerichtet. Jetzt können Sie Ihre Signale schreiben. Setzen Sie diese entweder in Foo.cs
oder alle zusammen in einer Signals.cs
Datei:
partial class Foo
{
partial void PostInsert()
{
EventLog.AddEvent(EventType.FooInserted, this);
}
}
Dies ist ein wenig kompliziert, so dass, wenn etwas nicht sinnvoll ist, lassen Sie einen Kommentar und ich werde mein Bestes tun, um es zu behandeln.