Problèmes de suppression en cascade Entity Framework - Clé étrangère définie sur null

c# cascading-deletes entity-framework

Question

J'ai le modèle suivant que j'ai mappé avec Entity Framework: Mitglied -> Auftrag -> Teilprojekt

J'ai tout mis en place dans la base de données avec des clés étrangères et "en cascade de suppression". Si j'effectue des tests sur la base de données, tout fonctionne correctement. Le problème se pose dès que j'utilise Entity Framework pour ajouter et surtout supprimer des objets. Considérons le code suivant:

Mitglieder m1 = new Mitglieder();
m1.Name = "erstes";

Auftraege a1 = new Auftraege();
a1.Name = "a1";
m1.Auftraege.Add(a1);

Teilprojekte t1 = new Teilprojekte();
t1.Name = "t1";
a1.Teilprojekte.Add(t1);

context.AddToMitglieder(m1);


Mitglieder m2 = new Mitglieder();
m2.Name = "zweites";

Auftraege a2 = new Auftraege();
a2.Name = "a2";
m2.Auftraege.Add(a2);

Teilprojekte t2 = new Teilprojekte();
t2.Name = "t2";
a2.Teilprojekte.Add(t2);

context.AddToMitglieder(m2);
context.SaveChanges();

Cela ajoute correctement tous les objets et définit les clés étrangères. Si j'exécute ensuite le code suivant pour supprimer l'Auftraege:

 var members = context.Mitglieder.ToList();

 var mem1 = members.Single(m => m.Name == "erstes");
 mem1.Auftraege.Load();
 var auf1 = mem1.Auftraege.First();
 context.DeleteObject(auf1);

 var mem2 = members.Single(m => m.Name == "zweites");
 mem2.Auftraege.Load();
 var auf2 = mem2.Auftraege.First();

 //THIS IS THE LINE THAT MAKES THE DIFFERENCE
 auf2.Teilprojekte.Load();

 context.DeleteObject(auf2);

 context.SaveChanges();

Les deux Auftraege a1 et a2 sont correctement supprimés; le Teilprojekt t1 est également supprimé mais le Teilprojekt t2 n'est pas supprimé;

Sa colonne AuftragID est définie sur NULL!

La seule différence est que pour a1 je n'ai pas chargé le Teilprojekte et pour a2 je les ai chargés. Je ne comprends pas pourquoi cela ne fonctionne pas correctement. De plus, dans le SSDL, tout est configuré correctement:

    <Association Name="FK_Auftraege_Mitglieder">
      <End Role="Mitglieder" Type="TechnBuero.Store.Mitglieder" Multiplicity="0..1">
        <OnDelete Action="Cascade" />
      </End>
      <End Role="Auftraege" Type="TechnBuero.Store.Auftraege" Multiplicity="*" />
      <ReferentialConstraint>
        <Principal Role="Mitglieder">
          <PropertyRef Name="ID" />
        </Principal>
        <Dependent Role="Auftraege">
          <PropertyRef Name="Mitglieder_ID" />
        </Dependent>
      </ReferentialConstraint>
    </Association>
    </Association>
        <Association Name="FK_Teilprojekte_Auftraege">
      <End Role="Auftraege" Type="TechnBuero.Store.Auftraege" Multiplicity="0..1">
        <OnDelete Action="Cascade" />
      </End>
      <End Role="Teilprojekte" Type="TechnBuero.Store.Teilprojekte" Multiplicity="*" />
      <ReferentialConstraint>
        <Principal Role="Auftraege">
          <PropertyRef Name="ID" />
        </Principal>
        <Dependent Role="Teilprojekte">
          <PropertyRef Name="AuftragsID" />
        </Dependent>
      </ReferentialConstraint>
    </Association>

Si je mets AuftragsID sur la table Teilprojekte sur non null, j'obtiens l'erreur suivante de Entity Framework:

Error 1 Error 3023: Problem in Mapping Fragments starting at lines 638, 702: Column Teilprojekte.AuftragsID has no default value and is not nullable. A column value is required to store entity data. 
An Entity with Key (PK) will not round-trip when:
((PK is in 'Teilprojekte' EntitySet OR PK plays Role 'Teilprojekte' in AssociationSet 'FK_Teilprojekte_Auftraege') AND (PK is NOT in 'Teilprojekte' EntitySet OR PK does NOT play Role 'Teilprojekte' in AssociationSet 'FK_Teilprojekte_Auftraege'))

Quelqu'un peut-il m'aider et me dire ce qui ne va pas et comment je peux résoudre ce problème? Merci

Réponse populaire

La suppression en cascade dans EDMX ne fera que mettre en cascade les entités (attachées) chargées. donc, à moins que votre entité ne soit chargée, elle ne sera pas mise en cascade par la suppression. EF s'attend à ce que votre base de données cascade la suppression.

  1. Assurez-vous que la suppression en cascade est configurée dans votre base de données.
  2. Définir la suppression en cascade dans votre EDMX
  3. Si vous ne pouvez pas faire 1, assurez-vous de charger toutes les entités avant de supprimer


Related

Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow