不幸的是,實體框架6沒有內置的對SQL Server變更跟蹤的支持。但是,它確實暴露了攔截功能,使您可以修改它在執行之前生成的SQL。在更改ORM生成的SQL時,應該小心翼翼地完成這些操作,並且只有在有充分理由的情況下才會這樣做,但絕對有這種情況是適當的解決方案。
EF6公開IDbCommandInterceptor
類型,該類型爲您提供了整個查詢管道的鉤子。你簡單的需要實現這個接口並用EF註冊你的攔截器。
值得注意的是,該框架將在每個INSERT
,UPDATE
和DELETE
之前調用NonQueryExecuting
,這使其成爲您鎖定變更跟蹤的好地方。
作爲一個簡單的例子,考慮這個攔截:
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)
{
}
}
當EF產生改變數據塊的狀態的任何查詢時,它會執行查詢之前調用此方法。這使您有機會使用標準SQL注入您的自定義更改跟蹤上下文。
要註冊與EF你的攔截器,只需撥打DbInterception.Add
地方在你的啓動代碼:
var changeTrackingInterceptor = new ChangeTrackingInterceptor();
DbInterception.Add(changeTrackingInterceptor);
這裏沒有一噸IDbCommandInterceptor
界面上大的文檔,但this MSDN article是一個良好的開端。
不確定我的問題是否正確 - 從我推斷的情況來看,只要通過EF完成更新,就想執行chnage_tracking。也許你可以爲你的更新/添加/刪除存儲特效(有你需要的跟蹤),然後將它映射到EF實體。更多細節在這裏 - http://www.entityframeworktutorial.net/entityframework6/code-first-insert-update-delete-stored-procedure-mapping.aspx。讓我知道如果我看錯了你的問題.. – Developer