Überschreibendes Löschen von Entitäten mit Zuordnungen

8

Ich versuche, in meinem Projekt eine weiche Löschfunktion zu implementieren, indem ich die DbContext.SaveChanges() -Methode überschreibe und die Löschung von Entitäten rückgängig mache, die meine ISoftDelete -Schnittstelle implementieren.

%Vor%

In der Methode SaveChanges() rufe ich meine SoftDelete () -Methode für jeden Eintrag im 'gelöschten' Zustand auf und implementiert ISoftDelete .:

%Vor%

Meine SoftDelete() Methode ist wie folgt:

%Vor%

Das wird perfekt funktionieren, bis ich auf eine Entität stoße, die eine Eins-zu-eins-Assoziation zu etwas anderem hat. An diesem Punkt wird eine Ausnahme mit diesem Fehler ausgelöst:

  

{"Eine Beziehung aus dem 'ChildParent' AssociationSet ist in   der Status "Gelöscht" Bei gegebenen Multiplizitätsbedingungen gibt es eine entsprechende   "Eltern" muss auch im Status "Gelöscht" sein. "}

Gibt es eine Möglichkeit, alle Zuordnungen für diese Entität zu erhalten und den gelöschten Status für sie ebenfalls zu ändern?

Ich habe bereits versucht, den Verweis auf die tatsächlich verknüpfte Entität zu erhalten, aber die EntityState der Entität wird auf Unchanged anstelle von Deleted gesetzt.

    
Jonathan 02.10.2012, 16:01
quelle

1 Antwort

0

Im Allgemeinen müssen Sie zuerst die Childs in den Parent-Child-Beziehungen löschen. Beginne mit dem obersten Elternteil und rekore dich durch die Kinder. Markieren Sie jedes besuchte Element, damit Sie verfolgen können, ob es bereits gelöscht wurde (im Fall von Rückverweisen).

Wenn Sie ein "Business-Objekt" -Konzept haben, können Sie die Eigenschaften Childs und Parent hinzufügen, um die Navigation zu erleichtern. Andernfalls müssen Sie dies bei jedem Elternteil mit nicht trivialen Kindbeziehungen "handkoden".

Beachten Sie auch, dass Sie mit einer LINQ-Anweisung keine Kontrolle über das tatsächliche Traversing haben.

Ich weiß, dass das oben genannte eine Menge Arbeit ist, aber überlegen Sie, wie Sie einen Mechanismus in EF einrichten würden, der automatisch die benötigte Beziehungsinformation ableitet ?! Du würdest am Ende so etwas tun.

    
mhoff 13.10.2012 06:16
quelle