2015-02-20 9 views
8

Ich untersuche Entity Framework 6.1.1 mit SQL Server 2008 R2.Entity Framework 6 (Code zuerst) Versionierung und Auditing von Entitäten

Momentan erstelle ich meine Modelle und Datenbanken mit der Code-First EF-Funktion. Mein grundlegender Anwendungsfall ist das Erstellen eines Journals aller Änderungen an einer bestimmten Entität (ID ist die Schlüsselspalte), um Auditoren dabei zu helfen, alle vorgenommenen Änderungen zu verfolgen. Beispiel:

|ID|Version|Created Date|Created By|Modified Date|Modified By|Modify Action| ... (rest of entity fields) 
------------------------------------------------------------------------------------------------------- 
| 4| 12 | 12-Mar-14 | tom  | 20-Feb-15 | jack  | Update  | 
| 4| 11 | 12-Mar-14 | tom  | 14-Feb-15 | jill  | Update  | 
| 4| 1  | 12-Mar-14 | tom  | 12-Mar-14 | tom  | Create  | 

Unterstützt Entity Framework diese Art von Datenbankschema? Wenn ja, wie kann ich meine Modelle/Lösung einstellen, um dies zu erleichtern?

Die andere Alternative, die ich habe, ist durch alle Anrufe an die SaveChanges() Methode auf den DbContext Abfangen und melden Sie sich alle Datenbankänderungen in eine separate Audit Tabelle, aber dies könnte Abrufen von Informationen schwieriger machen.

Jede Hilfe beim Erstellen von Audit-Trails mit SQL Server und EF 6 wird sehr geschätzt.

public class MyContext : DbContext 
{ 

public int SaveChanges(int userId) 
{ 
    // Get all Added/Deleted/Modified entities (not Unmodified or Detached) 
    foreach (var ent in this.ChangeTracker.Entries().Where(p => p.State == EntityState.Added 
    || p.State == EntityState.Deleted || p.State == EntityState.Modified)) 
    { 

     foreach (AuditLog x in GetAuditRecordsForChange(ent, userId)) 
     { 
      this.AuditLogs.Add(x); 
     } 
    } 
    return base.SaveChanges(); 
    } 
... 

Also, wenn ich ein bestimmtes Unternehmen, ich nenne nur die überladene Savechanges & Pass in einer Benutzer-ID anmelden möchten:

+0

möglich Duplikat [Implementierung von Audit-Log/Änderungsprotokoll mit MVC & Entity Framework] (http://stackoverflow.com/questions/6867459/implementing-audit-log-change-history- with-mvc-entity-framework) –

+0

Das kann Sie vielleicht auf den Weg bringen: http://auditdbcontext.codeplex.com/ –

+0

Ich hatte eher gehofft, Entity-Versionen zu haben, da dies mit anderen Datenbankanwendungen konsistent ist. Die Versionsverwaltung wird derzeit von Monster-T-SQL-Funktionen gesteuert, die ich nicht implementieren möchte, insbesondere mit EF! –

Antwort

6

Ich habe den zweiten Ansatz, den Sie erwähnen, durch eine Überlastung des DbContext Savechanges() -Methode verwendet, :

public void Update(StockCatalogueItem entity, int userId) 
{ 
    _context.SaveChanges(userId); 
} 

ich habe auch eine benutzerdefinierte DoNotLog Attribut, das ich die Elementeigenschaften verzieren, die ich nicht anmelden möchten. Ohne dies könnte die Protokollierung eine große Menge an Daten generieren, da jede Entitätsänderung gleich einem db-Eintrag ist.

[DoNotLog] 
public int CreatedBy { get; set; } 

Die GetAuditRecordsForChange Methode macht die Überprüfung für alle DoNotLog Eigenschaften und gibt einen List<AuditLog>, die in der AuditLogs Tabelle gespeichert wird:

public class AuditLog 
    { 
     public int Id { get; set; } 
     public int CreatedBy { get; set; } 
     public DateTime CreatedOn { get; set; } 
     public AuditEventType EventType { get; set; } 
     public string TableName { get; set; } 
     public int EntityId { get; set; } 
     public string ColumnName { get; set; } 
     public string Controller { get; set; } 
     public string Action { get; set; } 
     public string IPAddress { get; set; } 
     public string OriginalValue { get; set; } 
     public string NewValue { get; set; } 
    } 
3

Sie bei Entity Framework Extended aussehen könnte. Es verfügt über Audit-Funktionen, mit denen ich alle Änderungen an Entitäten in XML protokolliert habe. Aus der Dokumentation:

Das Audit-Log-Funktion werden die Änderungen an Einheiten erfassen jederzeit sie an die Datenbank übermittelt werden. Das Überwachungsprotokoll erfasst nur die Entitäten, die geändert wurden, und nur die Eigenschaften für diese Entitäten , die geändert wurden. Die Vorher- und Nachher-Werte werden aufgezeichnet. AuditLogger.LastAudit ist, wo diese Informationen gehalten werden, und es gibt eine ToXml() - Methode, die es einfach macht, das AuditLog in xml für easy-Speicher zu verwandeln.

Das AuditLog kann über Attribute auf den Entitäten oder über eineFluent Configuration API angepasst werden.

UPDATE:

Entity Framework Extended nicht mehr unterstützt seit 2015 verweisen auf Entity Framework Plus für diese Funktion.

0

Ich würde sagen, das ist ein guter Kandidat für das Event-Sourcing-Muster in einer DDD-Architektur erwähnt. Sie ändern nie Ihre Entitätstabelle, sondern fügen immer ein.

Wenn Sie also eine bestimmte Version benötigen, spielen Sie einfach alle Ereignisse erneut ab und wenden sie auf die Entität von Version 0 bis zu der Version an, nach der Sie suchen. Skalierbarkeit kann mit Entity-Snapshots gelöst werden.

Der zweite Ansatz ist ebenfalls gültig.

Referenz: http://microservices.io/patterns/data/event-sourcing.html

Verwandte Themen