Implementazione del registro di controllo / Cronologia delle modifiche con MVC ed Entity Framework

Sto creando un registro delle modifiche cronologia / controllo per la mia app MVC che sta utilizzando Entity Framework.

Quindi, in particolare nel metodo di modifica public ActionResult Edit(ViewModel vm) , troviamo l’object che stiamo cercando di aggiornare, e quindi utilizzare TryUpdateModel(object) per trasporre i valori dal modulo sull’object che stiamo cercando di aggiornare.

Voglio registrare una modifica quando cambia qualsiasi campo di quell’object. Quindi in pratica quello di cui ho bisogno è una copia dell’object prima che venga modificata e quindi confrontarla dopo che TryUpdateModel(object) ha fatto il suo lavoro. vale a dire

 [HttpPost] public ActionResult Edit(ViewModel vm) { //Need to take the copy here var object = EntityFramework.Object.Single(x=>x.ID = vm.ID); if (ModelState.IsValid) { //Form the un edited view model var uneditedVM = BuildViewModel(vm.ID); //this line seems to confuse the EntityFramework (BuildViewModel() is used to build the model when originally displaying the form) //Compare with old view model WriteChanges(uneditedVM, vm); ... TryUpdateModel(object); } ... } 

Ma il problema è quando il codice recupera il “vm non modificato”, questo sta causando alcune modifiche inaspettate in EntityFramework – così che TryUpdateModel(object); lancia un UpdateException .

Quindi la domanda è – in questa situazione – come posso creare una copia object al di fuori di EntityFramework per confrontare la cronologia delle modifiche / audit, in modo che non influenzi o modifichi EntityFramework a tutti

modifica: non voglio usare i trigger. Devi registrare il nome utente che l’ha fatto.

edit1: utilizzo di EFv4, non troppo sicuro di come ignorare SaveChanges() ma potrebbe essere un’opzione


Questa strada sembra andare da nessuna parte, per un requisito così semplice! Finalmente ho capito di sovrascrivere correttamente, ma ora ottengo un’eccezione con quel codice:

 public partial class Entities { public override int SaveChanges(SaveOptions options) { DetectChanges(); var modifiedEntities = ObjectStateManager.GetObjectStateEntries(EntityState.Modified); foreach (var entry in modifiedEntities) { var modifiedProps = ObjectStateManager.GetObjectStateEntry(entry).GetModifiedProperties(); //This line throws exception The ObjectStateManager does not contain an ObjectStateEntry with a reference to an object of type 'System.Data.Objects.EntityEntry'. var currentValues = ObjectStateManager.GetObjectStateEntry(entry).CurrentValues; foreach (var propName in modifiedProps) { var newValue = currentValues[propName]; //log changes } } //return base.SaveChanges(); return base.SaveChanges(options); } }