Duże zastrzeżenie:NIETESTOWANE - po prostu głośno myśląc.
EF obsługuje zastępowanie SaveChanges
, więc być może jedną z opcji jest zdefiniowanie interfejsu, takiego jak:
interface IVersionedRow {
int RowVersion {get;set;}
}
i dodaj int RowVersion
właściwość/pole zarówno do klasy(-y) modelu, jak i do tabeli(-y) bazy danych i użyj partial class
aby zaimplementować ten interfejs (przy użyciu niejawnej implementacji interfejsu):
partial class Customer : IVersionedRow {}
partial class Order : IVersionedRow {}
...
Następnie zastąp SaveChanges
, coś takiego:
public override int SaveChanges(SaveOptions options)
{
foreach (ObjectStateEntry entry in
ObjectStateManager.GetObjectStateEntries(EntityState.Modified))
{
var v = entry.Entity as IVersionedRow;
if(v != null) v.RowVersion++;
}
return base.SaveChanges(options);
}
który powinien wtedy funkcjonować (teoretycznie - nieprzetestowany) jako ręcznie zaimplementowany licznik wersji wiersza. Pozostaw włączoną walidację zmian dla RowVersion
i to powinno służyć.