2016-04-05 4 views
0

Wie erhält man eine neue Datensatz-ID beim Erstellen eines Audit-Trails?

public override saveChanges(){ 
 
    var changeList = tracker.detectChange(); 
 
    foreach(var change in changeList){ 
 
     switch(change.state){ 
 
      case ADD: ... 
 
      case MODIFIED: ... 
 
     } 
 
    } 
 
     
 
     
 
    base.saveChanges(); 
 
}

I haben die Struktur obige Code (nur für Pseudo-Code Idee darstellt) der Prüfpfad Schaffung Änderungen speichern.

Das einzige Problem ist, dass ich nicht den neu hinzugefügte Datensatz-ID erhalten kann als saveChanges noch nicht genannt worden, aber wenn ich saveChanges vorher anrufen, dann könnte der Tracker nicht die Änderungen verfolgt, wie ALL Zustand der Einträge unchanged werden wird !

Wie kann ich die Änderungen noch verfolgen, während ich die neue Datensatz-ID erhalte?

EDITED

Grund, warum ich den neuen Datensatz ID bekommen haben, wie Sie sich vorstellen können, ist ein Audit-Trail Datensatz in der DB zu speichern. Aus irgendeinem Grund muss es ein XML-Dokument sein, das die ID der Entität, den ursprünglichen Wert & neuen Wert speichert (und einige andere Dinge, die nicht von Belang sind).

Say für eine neu hinzugefügte "Item" in der Item-Tabelle in DB, muss ich einen neuen Audit-Trail-Datensatz, der mindestens diese neue "Item" ID, ursprünglichen Wert (der null ist) und neue Wert.

+0

Können Sie erklären, was Sie mit der neuen Datensatz-ID erreichen möchten? – wonderbell

+0

Verwenden Sie 'EntityFramework'? – StepUp

+0

@wonderbell Bitte siehe bearbeitet. – shole

Antwort

3

Die geänderten Entitäten können zu separaten Listen entsprechend ihrem Status hinzugefügt werden, bevor die Methode saveChanges aufgerufen wird.

Nach saveChanges werden alle Entitäten mit neuen IDs aktualisiert und die entsprechenden Listen können zum Generieren der Audit-Protokolle verwendet werden.

public override saveChanges(){ 
    // gather audit data 
    initialize List<Entity> addedEntities, modifiedEntities, deletedEntities 
    var changeList = tracker.detectChange(); 
    foreach(var change in changeList){ 
     switch(change.state){ 
      case ADD: add to addedEntities 
      case MODIFIED: add to modifiedEntities 
     } 
    } 


    base.saveChanges(); 
    performAudit(addedEntities, modifiedEntities, deletedEntities); 
} 

function performAudit(...){ 
    generateXML(...); 
    saveToDB(...); 
    sendEmail(...); 
} 

Hinweis: habe ich nicht getestet, wenn deletedEntities noch bestehen würden, aber sie können trotzdem vor savechanges geprüft werden, da sie bereits eine Id haben. Aber ich hoffe, Sie bekommen eine Idee, wie Sie Ihr Problem lösen können.

+0

Ja, ich verstehe Ihre Idee, so sogar Wenn der Status der Entität unverändert ist, kann ich immer noch addedEntities für diese neuen Datensätze o.ä. Ich werde es versuchen, hoffe es funktioniert und wird Sie wissen lassen – shole

+0

Danke!Es funktioniert, ich benutze deine Idee und es funktioniert wie ein Charme – shole

+0

Froh, dass es geholfen hat. – wonderbell

Verwandte Themen