Supprimer un objet et toutes ses entités associées dans Entity Framework

ado.net entity-framework

Question

Est-ce que quelqu'un sait comment supprimer un objet et toutes ses entités associées à l'intérieur de EF sans parcourir manuellement le graphe d'objets et en supprimer chacun?

Par exemple, j'ai SalesOrder et SalesOrderDetails avec une relation 1: N entre eux. Lorsque je supprime un SalesOrder, je souhaite que tous les SalesOrderDetails soient automatiquement supprimés.

Est-ce possible dans EF?

Réponse acceptée

Vous ne devriez pas faire cela dans Entity Framework. Toutes les bases de données relationnelles populaires prennent en charge ON CASCADE DELETE sur des clés étrangères, ce qui est beaucoup plus efficace. Je vous suggère simplement d'y aller.


Réponse populaire

dans cet article, Alex Jamese (qui publie sa réponse) a publié un article complet sur le sujet.

http://blogs.msdn.com/b/alexj/archive/2009/08/19/tip-33-how-cascade-delete-really-works-in-ef.aspx

L'EF est responsable de l'exactitude du ObjectContext après SaveChanges (). Ainsi, l'EF tente de synchroniser le ObjectContext avec l'état de base de données attendu après la cascade attendue dans la base de données. Un signe révélateur de ceci est que si vous ouvrez quelque chose comme SqlProfiler, vous remarquerez que EF émet des demandes DELETE pour les entités dépendantes qu'il connaît (c'est-à-dire qui sont chargées dans ObjectContext) lorsqu'un principal est supprimé. Essentiellement, Entity Framework s'attend à ce que la suppression du principal dans la base de données supprime toutes les personnes à sa charge dans la base de données. Donc, il faut, ce qui devrait être, un DELETE redondant se demander lui-même afin que les personnes à charge déjà chargées soient supprimées de ObjectContext. L'essentiel à noter est que l'EF ne récupère pas toutes les entités dépendantes et émet des suppressions pour elles: il supprime uniquement les personnes dépendantes déjà en mémoire.



Related

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