2016-04-27 9 views
3

Für Auditing-Zwecke muss ich eine Spalte "UpdatedBy" in bestimmten Tabellen aktualisieren, bevor Zeilen gelöscht werden, was einige Auditing von Drittanbietern auslösen wird.Update vor dem Löschen im Entitätsframework

Meine aktuelle Lösung besteht darin, eine benutzerdefinierte SaveChanges-Methode für meine Context-Klasse zu erstellen, aber alle Änderungen, die ich an meinen gelöschten Entitäten vornimmt, werden ignoriert, und das generierte SQL ist nur ein DELETE-Befehl.

Ist es möglich, für die Entitäten in der SaveChanges-Methode sowohl ein UPDATE als auch ein DELETE auszulösen?

CS-Code

public partial class MyContext : DbContext 
{ 
    public int SaveChanges(int userId) 
    { 
     foreach (var entry in ChangeTracker.Entries<Auditable>()) 
     { 
      if (entry.State == EntityState.Deleted) 
      { 
       entry.Entity.UpdatedBy = userId; 
      } 
     } 

     return base.SaveChanges(); 
    } 
} 

Beispiel SQL generiert

DELETE FROM EntityTable 
WHERE Id = @00 

Wunsch SQL

UPDATE EntityTable 
SET UpdateBy = @00 
WHERE Id = @01 

DELETE FROM EntityTable 
WHERE Id = @01 

Update

Um zu verdeutlichen, verwende ich eine Drittanbieter-Audit-Framework, die neue Zeilen in einer separaten Datenbank erstellt. Der Zweck des UPDATE vor dem DELETE besteht darin, es der separaten Datenbank zu ermöglichen, die Benutzer-ID zu speichern, die das Löschen ausgeführt hat. Obwohl die Zeile aus der ursprünglichen Datenbank entfernt wurde, muss daher die Prüfzeile erstellt werden, die vom UPDATE ausgelöst wird.

+1

aber wenn Sie etwas aktualisieren und dann löschen Sie dann warum müssen aktualisieren? zum Beispiel in der Tabelle "A" aktualisieren Sie "ROW1" und löschen Sie dann "ROW1", so "ROW1" wird physisch entfernt, warum also zu aktualisieren –

+0

Es gibt keine Möglichkeit, das in einer einzigen Transaktion in EF zu tun. Sie müssen 2 Transaktionen ausführen, eine zum Aktualisieren und eine weitere zum Ausführen des Löschvorgangs. – Igor

+0

Wie funktioniert das Aktivieren der Änderungsverfolgung für diese Tabelle in SQL Server? Wenn Sie SQL Server verwenden. – vendettamit

Antwort

2

Entity Framework kann nicht gezwungen werden, das UPDATE sowie das DELETE durchzuführen, aber ich kann SQL generieren, um das Update stattdessen manuell aufzurufen. Und führen Sie die Änderungen in einer Transaktion aus.

int SaveChangesWithDelete(int userId) 
    { 
     using (var tx= Database.BeginTransaction()) //Begin a new transaction 
     { 
      var entitiyGroups = ChangeTracker.Entries() 
       .Where(e => e.State == EntityState.Deleted && e.Entity is Auditable) 
       .Select(e => e.Entity) 
       .GroupBy(d => d.GetType(); 

      foreach (var entityGroup in entitiyGroups) //Loop through deleted entities and run a manual UPDATE 
      { 
       string query = string.Format(@" 
        UPDATE {0} SET UpdatedBy = {1} 
        WHERE Id IN ({2}) 
       ", entityGroup.Key.Name, userId, string.Join(",", entityGroup.Select(e => PrimaryKeyValue(e)))); 

       Database.ExecuteSqlCommand(query); //Execute the query - this triggers the audit framework 
      } 

      int result = SaveChanges();  //save the context changes as normal 
      tx.Commit();     //commit the transaction 
      return result;     //return the result 
     } 
    } 
Verwandte Themen