2013-08-06 3 views
5

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.

+0

Zunächst denke ich über die Löschaktion im Controller nach. – nocturns2

Antwort

11

Standardmäßig werden nur geänderte und hinzugefügte Entitäten validiert. Dies kann geändert werden, indem die Methode DbContext.ShouldValidateEntity() überschrieben wird, um auch für gelöschte Entitäten "true" zurückzugeben.

+0

Hallo @pawel. Genau das habe ich gebraucht und es hat perfekt funktioniert. Ich hätte in dem Code, den ich in DbContext für das Verfolgen von Änderungen getestet habe, aber diese gemischte Validierung und Tracking, die keine kluge Idee ist, getestet haben können. Ich habe einen Beispielcode in meine Antwort eingefügt. –

+0

Froh, dass es für Sie funktioniert und danke, dass Sie den Code hinzugefügt haben, um die Lösung zu zeigen. – Pawel

Verwandte Themen