Niestety, Entity Framework 6 nie ma wbudowanego wsparcia dla SQL Server Change Tracking. Jednakże ujawnia możliwości przechwytywania, które umożliwiają modyfikowanie SQL, który generuje przed wykonaniem. Podczas zmiany SQL, który generuje ORM, należy robić to ostrożnie i tylko z uzasadnionego powodu, są absolutnie przypadki, w których jest to właściwe rozwiązanie.
EF6 udostępnia typ IDbCommandInterceptor
, który umożliwia przechwycenie całego przebiegu zapytania. Prosta potrzeba wdrożenia tego interfejsu i zarejestrowania przechwytywacza za pomocą EF.
Warto zauważyć, że ramy wezwie NonQueryExecuting
przed każdym INSERT
, UPDATE
i DELETE
, co czyni go doskonałym miejscem, aby zaczepić w śledzeniu zmian.
Jako prosty przykład rozważmy tę przechwytywania:
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)
{
}
}
Kiedy EF generuje jakieś zapytania, który zmienia stan DB, to wywołanie tej metody przed wykonaniem zapytania. Daje to możliwość wstrzyknięcia niestandardowego kontekstu śledzenia zmian za pomocą standardowego kodu SQL.
Aby zarejestrować przechwytywania EF, wystarczy zadzwonić DbInterception.Add
gdzieś w kodzie startowym:
var changeTrackingInterceptor = new ChangeTrackingInterceptor();
DbInterception.Add(changeTrackingInterceptor);
Nie ma mnóstwo doskonałej dokumentacji interfejsu IDbCommandInterceptor
, ale this MSDN article jest dobrym miejscem, aby rozpocząć.
Nie jestem pewien, czy dobrze odpowiedziałem na pytanie - z tego co wnioskowałem, chcesz wykonać chnage_tracking za każdym razem, gdy aktualizacja odbywa się przez EF. Możliwe, że masz zapisane procsy (posiadające śledzenie, których potrzebujesz) do swoich aktualizacji/dodawania/usuwania, a następnie mapuj je do jednostek EF. Więcej szczegółów tutaj - http://www.entityframeworktutorial.net/entityframework6/code-first-insert-update-delete-stored-procedure-mapping.aspx. Daj mi znać, jeśli przeczytam twoje pytanie źle .. – Developer