2010-04-10 1 views
2

Mon Dieu, EF est si frustrant. Je n'arrive pas à comprendre ce que je dois faire pour pouvoir supprimer un objet. Il semble que je puisse retirer l'objet mais pas les objets enfants associés. Quelqu'un peut-il me dire quelle est la règle générale lorsque vous voulez supprimer tous les objets enfants liés d'un objet donné?Suppression d'une entité avec des relations enfants à l'aide du problème .Net Entity Framework

J'ai essayé de charger tous les objets connexes comme celui-ci:

Entry entry = ModelContext.GetObjectByKey(new EntityKey("ModelContainer.EntrySet", "Id", id)) as Entry; 
entry.ChildEnteries.Load(); 

if (entry != null) 
{ 
    ModelContext.DeleteObject(entry); 
    ModelContext.SaveChanges(); 
} 

Je reçois des erreurs liées aux relations: A relationship is being added or deleted from an AssociationSet 'EntryEntry'. With cardinality constraints, a corresponding 'Entry1' must also be added or deleted.

Pourquoi ne puis-je charger simplement l'objet en utilisant modelcontext.GetObjectByKey et retirez-le le long avec ses objets enfants?

Mon autre question est de savoir si je peux supprimer un objet en utilisant la commande Entity comme ça?

DELETE e from objectset as e where e.id = 12 

J'ai essayé quelques variantes et toutes ont des exceptions.

+1

"Mon Dieu, EF est tellement frustrant" +1 :) –

Répondre

3

Si vous n'utilisez pas les suppressions en cascade, vous devrez supprimer les objets référencés indépendamment.

Je pense que vous voulez quelque chose comme ceci:

ObjectSet os = ModelContext.ObjectSet.First(x => x.id == 12); 
ModelContext.DeleteObject(os);  
ModelContext.SaveChanges(); 

Vous pouvez faire en cascade supprime dans le cadre de l'entité aussi, mais assurez-vous le configurer dans votre SQL et assurez-vous de mettre à jour à partir des sources de données à partir du fichier EDMX. En particulier make sure CSDL part has the following:

<Association Name="FK_ItemChildren_Item"> 
<End Type="Model.Item" Role="Item" Multiplicity="1"> 
    <OnDelete Action="Cascade"></OnDelete> 
</End> 
<End Type="Model.ItemChildren" Role="ItemChildren" 
    Multiplicity="*"> 
</End> 
</Association> 
+0

votre solution avant Essayé. Il supprime uniquement l'objet mais pas les objets enfants associés. – Roman

+0

@Am: ajouté plus d'infos –

+0

Le problème est que j'ai défini manuellement le fichier edmx et mappé les champs de mes enités aux champs de tables dans DB. Toutes mes tables dans MySQL sont MyISAM et je n'ai aucune clé étrangère définie pour eux. Est-ce que l'ajout de cascade delete manuellement au fichier edmx fonctionnera même s'il n'existe aucune clé étrangère réelle définie dans la base de données? – Roman

Questions connexes