Entity Framework - Eine untergeordnete Sammlung löschen

entity-framework

Frage

Ich bin auf ein interessantes Problem mit Entity Framework gestoßen und aufgrund des Codes, den ich zur Bewältigung des Problems verwenden musste, vermute ich, dass meine Lösung nicht ideal ist. Ich habe eine 1-zu-Viele-Beziehung zwischen Tabelle A und Tabelle B, wobei Entitäten in TableB auf TableA verweisen. Ich habe ein Szenario, in dem ich alle untergeordneten Elemente einer Zeile in TableA gleichzeitig löschen möchte, und ich dachte, dies könnte durch einfaches Löschen der Sammlung erreicht werden:

Entity.Children.Clear()

Als ich versuche, die Änderungen zu speichern, kam es leider zu einer Verletzung des Fremdschlüssels.

Eine Beziehung wird aus einem AssociationSet 'FK_EntityB_EntityA' hinzugefügt oder gelöscht. Bei Kardinalitätsbeschränkungen muss auch eine entsprechende 'EntityB' hinzugefügt oder gelöscht werden.

Die Lösung, die ich mir ausgedacht hatte, war das manuelle Löschen eines Objekts über DeleteObject () des Entitätskontexts, aber ich weiß nur, dass diese Logik, die ich verwende, falsch sein muss.

while (collection.Any())
    Entities.DeleteObject(collection.First());

Zum einen scheint die Tatsache, dass ich eine Where () - Schleife verwenden musste, weit weniger als ideal, aber ich nehme an, dass dies eine rein semantische Einschätzung meiner Seite ist. Gibt es auf jeden Fall etwas falsch mit meiner Vorgehensweise, oder gibt es vielleicht eine bessere Möglichkeit, eine untergeordnete Entitätsauflistung einer Entität zu löschen, sodass Entity Framework einen Datenspeicher für alle entfernten Objekte ordnungsgemäß aufruft?

Akzeptierte Antwort

Clear() entfernt den Verweis auf die Entität, nicht auf die Entität selbst.

Wenn Sie beabsichtigen, dass dies immer dieselbe Operation ist, können Sie mit AssociationChanged umgehen:

Entity.Children.AssociationChanged += 
    new CollectionChangeEventHandler(EntityChildrenChanged);
Entity.Children.Clear();            

    private void EntityChildrenChanged(object sender,
        CollectionChangeEventArgs e)
    {
        // Check for a related reference being removed. 
        if (e.Action == CollectionChangeAction.Remove)
        {
            Context.DeleteObject(e.Element);
        }
    }

Sie können dies mithilfe einer Teilklasse in Ihre Entität integrieren.


Beliebte Antwort

Sie können eine identifizierende Beziehung zwischen übergeordneten und untergeordneten Entitäten erstellen. EF löscht die untergeordnete Entität, wenn Sie sie aus der Sammlung des übergeordneten Elements löschen.

    public class Parent
    {
      public int ParentId {get;set;}
      public ICollection<Child> Children {get;set;}
    }

    public class Child
    {          
      public int ChildId {get;set;}
      public int ParentId {get;set;}
    }

Mapping-Konfiguration:

    modelBuilder.Entity<Child>().HasKey(x => new { x.ChildId, x.ParentId });
    modelBuilder.Entity<Parent>().HasMany(x => x.Children).WithRequired().HasForeignKey(x => x.ParentId);


Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum