[OK]を、私はこの1つ上のウサギの穴の下に完全行ってきたが、私はかなりクールなソリューションを持っていると思う:
まず、あなたのデータコンテキストにイベントハンドラを追加するポストのすべてを収集すること信号を保存してDispose
メソッドを非表示にして、処分する直前にイベントを呼び出すことができます。 (私が代わりにoverride
のnew
キーワードを使用することに注意してください。これは可能なイベントを呼び出すことができます。)
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);
}
}
次に、LINQ to SQLはあなたのために生成dbml
ファイルを検査T4 Templateを書きます。
<#
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)
{
#>
...
データベース(したがって各部分クラス)の各テーブルについて、以下の方法でパーシャルに追加します。
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
さらに、partial MyDataContext
をT4経由で追加します。これは、LinqからSQLへの部分的なメソッドに定義を追加することです(Merrittが述べたように)。
public partial class MyDataContext
{
// Add these three partial methods for each table
partial void InsertFoo(Foo foo)
{
foo.OnInsert(this);
ExecuteDynamicInsert(foo);
}
partial void UpdateFoo(Foo foo)
{
foo.OnUpdate(this);
ExecuteDynamicUpdate(foo);
}
partial void DeleteFoo(Foo foo)
{
foo.OnDelete(this);
ExecuteDynamicDelete(foo);
}
// ...
}
はどこか安全な離れてそれらのファイルを隠すため、誰もがそれを台無しにしようとしません。
シグナルフレームワークが設定されています。これで信号を書くことができます。
partial class Foo
{
partial void PostInsert()
{
EventLog.AddEvent(EventType.FooInserted, this);
}
}
これは少し複雑なので、何も意味がない場合は、コメントを残して、私はそれに対処するために全力を尽くしますしてください。Signals.cs
ファイルのいずれかでFoo.cs
またはすべてで一緒にこれらを入れてください。