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.
In der Methode SaveChanges()
rufe ich meine SoftDelete () -Methode für jeden Eintrag im 'gelöschten' Zustand auf und implementiert ISoftDelete
.:
Meine SoftDelete()
Methode ist wie folgt:
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.
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.
Tags und Links c# entity-framework entity-framework-4