Ich habe eine komplexe Klasse (siehe Beispielcode unten), die ich in einer Entity Framework Code First-Datenbank (V5) speichere. Das Problem besteht darin, dass wenn eine FooClass in den FooAndOrBar-Daten verwendet wird, die in der Datenbank gespeichert sind, der FooClass-Eintrag nicht gelöscht werden soll. Da es Null sein kann, werden die Fremdschlüsselüberprüfungen nicht verhindern, dass FooClass gelöscht wird, also muss ich mich selbst überprüfen.ValidateEntity im Entity Framework nicht aufgerufen Beim Löschen des Eintrags
class FooClass { ... some properties }
class BarClass { ... some properties }
class FooAndOrBar
{
public int Id { get; set; }
public FooClass Foo { get; set; }
public BarClass Bar { get; set; }
}
Daher folgende gute Praxis Einträge für die Validierung, die über mehrere Datenbankeinträge geschnitten, habe ich einen Test Entity Framework ValidateEntity Verfahren wie unten gezeigt.
protected override DbEntityValidationResult ValidateEntity(
DbEntityEntry entityEntry, IDictionary<object, object> items)
{
if (entityEntry.Entity is FooClass &&
entityEntry.State == EntityState.Delete)
{
if (... entityEntry.Entity is used in DbContext.FooAndOrBars ...)
return new DbEntityValidationResult(... error ...);
}
return base.ValidateEntity(entityEntry, items);
}
Das Problem ist, dass ValidateEntity anscheinend nicht beim Löschen aufgerufen wird. Das macht Sinn (warum validiere etwas, das du löschen willst), lässt mich aber das Problem, wo soll ich den Scheck ablegen? Ich benutze ein UnitOfWork/Repository-Muster und könnte dort einen Test machen, aber das riecht.
Hatte jemand anderes dieses Problem und löste es auf eine saubere Art und Weise? Ihre Eingabe wäre willkommen.
ANTWORT VON Pawel (siehe unten).
@pawel wies darauf hin, dass Sie ShouldValidateEntity überschreiben können, damit ValidateEntity für gelöschte Elemente aufgerufen wird. Hier ist ein Beispielcode für den Fall, dass jemand anderes dies nützlich findet.
/// <summary>
/// Override ShouldValidateEntity to cause deleted entities to be checked as well
/// </summary>
protected override bool ShouldValidateEntity(DbEntityEntry entityEntry)
{
if (entityEntry.State == EntityState.Deleted)
return true;
return base.ShouldValidateEntity(entityEntry);
}
Ich habe tatsächlich die Kontrolle etwas enger als nur alle gelöschten Elemente von der Art des Unternehmens überprüft, aber das ist nur die Leistung zu verbessern.
Zunächst denke ich über die Löschaktion im Controller nach. – nocturns2