146 votes

Entity Framework. Remove() vs.. DeleteObject()

Vous pouvez supprimer un élément à partir d'une base de données à l'aide de EF en utilisant l'une des deux méthodes suivantes.

Le premier est sur l' EntityCollection et le second sur l' ObjectContext.

Quand chacun doit-il être utilisé?

Est un préféré sur l'autre?

Remove() renvoie un bool et DeleteObject() retours void.

283voto

Slauma Points 76561

C'est généralement pas correct que vous pouvez "supprimer un élément à partir d'une base de données" avec les deux méthodes. Pour être précis, il est comme suit:

  • ObjectContext.DeleteObject(entity) marques de l'entité Deleted dans le contexte. ( EntityState Est Deleted par la suite.) Si vous appelez SaveChanges après EF envoie un SQL DELETE déclaration à la base de données. Si aucune des contraintes référentielles dans la base de données de violation de l'entité sera supprimé, sinon une exception est levée.

  • EntityCollection.Remove(childEntity) marques de la relation entre le parent et l' childEntity comme Deleted. Si l' childEntity lui-même est supprimé de la base de données et ce qui se passe exactement lorsque vous appelez SaveChanges dépend de la nature de la relation entre les deux:

    • Si la relation est facultatif, c'est à dire la clé étrangère qui fait référence à partir de l'enfant de la mère dans la base de données permet de NULL valeurs, ce sera la valeur null et si vous appelez SaveChanges ce NULL de la valeur pour l' childEntity seront écrites dans la base de données (c'est à dire la relation entre les deux est supprimé). Ce qui se passe avec un SQL UPDATE déclaration. Pas de DELETE déclaration se produit.

    • Si la relation est nécessaire (FK de ne pas autoriser NULL des valeurs) et la relation est de ne pas identifier (ce qui signifie que la clé étrangère n'est pas une partie de l'enfant (composite) clé primaire), vous devez ajouter de l'enfant à l'autre parent ou vous devez explicitement supprimer l'enfant (avec DeleteObject ensuite). Si vous ne faites pas l'un de ces référentiels contrainte est violée et EF lève une exception lorsque vous appelez SaveChanges - l'infâme "La relation ne peut pas être changé parce que l'un ou plusieurs de la clé étrangère propriétés non nullable" exception ou similaire.

    • Si la relation est l'identification (c'est nécessairement requis ensuite parce que toute une partie de la clé primaire ne peut pas être NULL) EF marquera l' childEntity comme Deleted . Si vous appelez SaveChanges SQL DELETE déclaration sera envoyée à la base de données. Si pas d'autres contraintes référentielles dans la base de données de violation de l'entité sera supprimé, sinon une exception est levée.

Je suis un peu confus au sujet de la section des Remarques sur la page MSDN vous avez lié parce qu'il est dit: "Si la relation a une contrainte d'intégrité référentielle, l'appel de la suppression de la méthode sur un objet dépendant marque à la fois la relation et de l'objet dépendant de la suppression.". Cela semble imprécise ou le même problème pour moi parce que tous les trois cas ci-dessus ont une "contrainte d'intégrité référentielle", mais seulement dans le dernier cas, l'enfant est en effet supprimé. (À moins qu'ils veulent dire par "dépendant de l'objet" d'un objet qui participe à l'identification de la relation, ce qui serait inhabituel de la terminologie.)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X