Frage

Ich habe an einigen Revisionshaken mit Entity Framework suchen. Viele von ihnen zeigen alte / neue Wertvergleiche. Dies macht sich hervorragend für einen Audit-Trail, aber ich bin auf der Suche Objekte Schnappschuss.

Zum Beispiel ... Lassen Sie uns sagen, dass ich eine Anwendung, die Produkte verwaltet. Ein Produkt hat mehrere Attribute und zugeordneten andere Objekte. Lassen Sie uns sagen, dass ich ein Objekt 10 mal ändern. Lassen Sie uns auch sagen, dass wichtig ist, dass ich Bildschirme dieser Objektänderungen anzeigen können (kein Audit-Trail, aber was der Bildschirm sah tatsächlich wie in einem Nur-Lese-Format). Was interessiert mich ist die Möglichkeit, das ursprüngliche EF Produkt-Objekt abzurufen (mit all den zugehörigen Daten) für alle 10 dieser Änderungen (je nachdem, welche ich sehen will), und dass auf meinem Bildschirm zu binden, verwenden.

Wenn ich SQL Server bin mit, welche Art sollte ich für das serialisierte Objekt verwenden heute (XML, Klecks, etc)? Macht es Sinn, dies zu tun?

War es hilfreich?

Lösung

Lassen Sie uns sehen. Sie haben eine Anforderung, ein Objekt Diagramm zu nehmen und es in die Datenbank in einem Format serialisiert, die Sie es später materialisieren lassen. Ich denke, dass es Werkzeuge, die genau dies tun. Einer von ihnen, es scheint mir, ist das Entity Framework.

Was Sie tun möchten, ist eine sehr gewöhnliche Sache. Betrachten wir ein Wiki-Engine. Das Wiki braucht eine aktuelle Revision haben, dass jeder sieht, und zurück Revisionen jedes Dokument. Das Wiki muss auch in der Lage sein in genau der gleichen Art und Weise eine Rück Revision anzuzeigen, dass eine aktuelle Revision angezeigt. Daher soll das gleiche Speicherformat für beide verwendet werden.

Ich würde vorschlagen, dass Sie alle Ihre Entitätstypen erlauben versioniert werden. Wenn Sie einen Entitätstyp bearbeiten, erhalten Sie die aktuelle Revision bearbeiten und eine Rück Revision speichern die vorherigen Werte enthält. (Der Grund, warum Sie die aktuelle Revision bearbeiten, anstatt eine neue Spitze des Einsetzens ist, weil andere Objekte, die derzeit nicht in ein Object materialisiert, Anbindungen an die Spitze enthalten, die Sie möchten, dass eine Anbindung an die Spitze erhalten, anstatt Links zu die Rück Revision.)

Bei Bedarf können Sie Ihre SQL Server-Tabellen partitionieren, so dass die Rückseite Revisionen in einer anderen Dateigruppe gespeichert sind. Dies würde Sie sichern damit die aktuellen Revisionen und wieder Revisionen getrennt.

Andere Tipps

Zuerst müssen Sie eine Reihe von Eigenschaften auf Ihre Tabellen hinzuzufügen:

  • Version -. Uhrzeit der letzten Änderung (kann auch anstelle von Zeit selbstinkrementierende Zähler werden)
  • LastModifiedBy -. Bezug auf die Benutzer, die letzte Änderung vorgenommen (wenn Sie speichern die)

Dann haben Sie mehrere Möglichkeiten, wie Sie Ihre Version der Geschichte zu speichern. Sie können

  1. Erstellen Sie eine neue Tabelle für jede der Haupt-Tabellen, die Sie für speichern Geschichte wollen. Dass die Geschichte Tabellen haben alle die gleichen Felder wie Haupttabelle, aber Primär- und Fremdschlüssel wird nicht erzwungen werden. Für jeden Fremdschlüssel auch zu der Zeit Version Version der referenzierten Eintrag speichern erstellt wurde.

  2. oder Sie können alles interessant, über Ihre Einheit serialisiert und speichern alle, die serialisiert Blobs für alle Objekte, die Sie in einer globalen Geschichte Tabelle Version wollen (Ich persönlich bevor ersten Ansatz).

Wie füllen Sie Ihre Geschichte Tabellen? Via Aktualisieren und Löschen von Triggern.

  • Im Update-Trigger für Ihr Unternehmen - Kopieren alle vorherigen Werte in die History-Tabelle. Für jeden Fremdschlüssel - auch kopiert aktuelle Version der referenzierten Entität
  • .
  • In DELETE-Trigger - tun im Grunde das gleiche
  • .

Beachten Sie, dass mehr und mehr moderne Systeme nicht wirklich alles löschen. Sie nur Marke Dinge wie gelöscht. Wenn Sie dieses Muster folgen wollen (was mehrere Vorteile hat.) - anstelle von IsDeleted Flag auf Ihre Entitäten zu löschen hinzufügen (natürlich Sie dann gelöscht Entitäten filtern müssen aus überall)

Wie sehen Sie Ihre Geschichte? Verwenden Sie einfach History-Tabelle, da sie alle die gleichen Eigenschaften wie Haupttabelle hat - kein Problem sein sollte. Aber - wenn Fremdschlüssel Erweiterung - sicherzustellen, dass referenzierte Entität Version das gleiche ist, wie Sie in Ihrer Geschichte Tabelle speichern. Wenn es nicht - man muss es zu Geschichte Tabelle, auf die verwiesen Einheit und Haltewerte gehen. Auf diese Weise werden Sie immer eine Momentaufnahme davon, wie wie Unternehmen sah in diesem Moment, einschließlich aller Referenzen.

Zusätzlich zu allen oben - Sie können auch Status Ihres Unternehmens zu einer früheren Version wiederherzustellen.

Hinweis

, dass diese Implementierung, während die einfachen, kann etwas Platz verbrauchen, weil es speichert Schnappschuss , nicht nur Änderungen vorgenommen werden. Wenn Sie wollen einfach nur Änderungen speichern - in Update-Trigger können Sie erkennen, welche Felder geändert wurden, serialisiert sie und speichert in der globalen Historientabelle. Auf diese Weise können Sie zumindest zeigt in der Benutzeroberfläche, was geändert wurde und von wem (obwohl Sie Probleme zu Rückkehr zu einer früheren Version haben könnten).

In einem Projekt, das ich uns vor kurzem gebaut haben wir in der SaveChanges Methode in der DbContext Klasse gesteckt. Das gab uns den Zugang zu einer Instanz der Klasse ChangeTracker. Der Aufruf ChangeTracker.Entries() gibt Ihnen Zugriff auf eine Liste von DbEntityEntry. DbEntityEntry hat folgende interessante Eigenschaften und Methoden:

  • State - wird das Objekt neu erstellt, geändert oder gelöscht werden
  • Entity - eine Kopie des Objekts, wie es steht
  • CurrentValues - eine Aufzählung der bearbeiteten Wert
  • OriginalValues - eine Aufzählung der ursprünglichen Werte

Wir haben eine Reihe von POCOs Änderungssätzen und Änderungen, die wir dann durch EF zugreifen konnte. Dies erlaubt unseren Nutzern zusammen mit Terminen und verantwortliche Benutzer Feldebene Änderungen anzuzeigen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top