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.)