残念ながら、Entity Framework 6にはSQL Server変更追跡の組み込みサポートがありません。ただし、実行前に生成するSQLを変更できる傍受機能が公開されています。 ORMによって生成されるSQLを変更する際には、慎重に行う必要があり、正当な理由がある場合にのみ適切な解決策であるケースがあります。
EF6はIDbCommandInterceptor
タイプを公開しており、クエリパイプライン全体にフックを与えます。このインタフェースを実装し、インターセプタをEFに登録するだけで簡単に必要です。
フレームワークでは、INSERT
,UPDATE
、およびDELETE
の前にNonQueryExecuting
が呼び出され、変更の追跡を行うのに最適です。簡単な例として
、このインターセプタを考慮する:EFは、DBの状態を変化させる任意のクエリを生成するとき
public class ChangeTrackingInterceptor : IDbCommandInterceptor
{
private byte[] GetChangeTrackingContext()
{
// TODO: Return the appropriate change tracking context data
return new byte[] { 0, 1, 2, 3 };
}
public void NonQueryExecuting(DbCommand command, DbCommandInterceptionContext<int> interceptionContext)
{
command.CommandText = "WITH CHANGE_TRACKING_CONTEXT (@change_tracking_context)\r\n" + command.CommandText;
// Create the varbinary(128) parameter
var parameter = command.CreateParameter();
parameter.DbType = DbType.Binary;
parameter.Size = 128;
parameter.ParameterName = "@change_tracking_context";
parameter.Value = GetChangeTrackingContext();
command.Parameters.Add(parameter);
}
public void NonQueryExecuted(DbCommand command, DbCommandInterceptionContext<int> interceptionContext)
{
}
public void ReaderExecuting(DbCommand command, DbCommandInterceptionContext<DbDataReader> interceptionContext)
{
}
public void ReaderExecuted(DbCommand command, DbCommandInterceptionContext<DbDataReader> interceptionContext)
{
}
public void ScalarExecuting(DbCommand command, DbCommandInterceptionContext<object> interceptionContext)
{
}
public void ScalarExecuted(DbCommand command, DbCommandInterceptionContext<object> interceptionContext)
{
}
}
、クエリを実行する前にこのメソッドを呼び出します。これにより、標準SQLを使用してカスタムの変更追跡コンテキストを挿入する機会が与えられます。 EFであなたのインターセプタを登録するには
は、単にあなたの起動コードでDbInterception.Add
どこかで呼び出す:
var changeTrackingInterceptor = new ChangeTrackingInterceptor();
DbInterception.Add(changeTrackingInterceptor);
をIDbCommandInterceptor
インターフェースに大きなドキュメントのトンはありませんが、this MSDN articleは、開始するには良い場所です。
あなたの質問が正しいかどうかわかりません - 私が推測したものから、EF経由で更新が行われるたびにchnage_trackingを実行したいと思います。あなたはあなたの更新/追加/削除のために必要な追跡を持っているprocsを保存して、それをEFエンティティにマップすることができます。詳細はこちら - http://www.entityframeworktutorial.net/entityframework6/code-first-insert-update-delete-stored-procedure-mapping.aspx – Developer