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.
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 –
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
Wie funktioniert das Aktivieren der Änderungsverfolgung für diese Tabelle in SQL Server? Wenn Sie SQL Server verwenden. – vendettamit