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

Vous pouvez supprimer un élément d’une firebase database à l’aide de EF en utilisant les deux méthodes suivantes.

  • EntityCollection.Remove Method

  • Méthode ObjectContext.DeleteObject

Le premier se trouve sur EntityCollection et le second sur ObjectContext .

Quand chacun devrait être utilisé?

L’un est-il préféré à l’autre?

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

Il n’est généralement pas correct de pouvoir ” supprimer un élément d’une firebase database ” avec les deux méthodes. Pour être précis, c’est comme ça:

  • ObjectContext.DeleteObject(entity) marque l’entité comme Deleted dans le contexte. (C’est EntityState est Deleted après cela.) Si vous appelez SaveChanges après cela, EF envoie une instruction SQL DELETE à la firebase database. Si aucune contrainte référentielle dans la firebase database n’est violée, l’entité sera supprimée, sinon une exception sera levée.

  • EntityCollection.Remove(childEntity) marque la relation entre parent et childEntity comme Deleted . Si le childEntity lui-même est supprimé de la firebase database et que se passe exactement quand vous appelez SaveChanges dépend du type de relation entre les deux:

    • Si la relation est facultative , c’est-à-dire que la clé étrangère faisant référence à l’enfant au parent dans la firebase database autorise les valeurs NULL , cet étranger sera défini sur null et si vous appelez SaveChanges cette valeur sera écrite dans la firebase database ( c’est-à-dire que la relation entre les deux est supprimée). Cela se produit avec une instruction SQL UPDATE . Aucune instruction DELETE se produit.

    • Si la relation est requirejse (le FK n’autorise pas les valeurs NULL ) et que la relation ne s’identifie pas (ce qui signifie que la clé étrangère ne fait pas partie de la clé primaire (composite) de l’enfant), vous devez soit append l’enfant à un autre parent ou vous devez explicitement supprimer l’enfant (avec DeleteObject alors). Si vous n’effectuez aucune de ces opérations, une contrainte référentielle est violée et EF déclenche une exception lorsque vous appelez SaveChanges – le sortingstement célèbre ” La relation n’a pas pu être modifiée car une ou plusieurs propriétés de clé étrangère ne sont pas nullables “ ou similaire.

    • Si la relation est identifiée (elle est nécessairement requirejse, car une partie quelconque de la clé primaire ne peut pas être NULL ), EF marquera également la childEntity comme Deleted . Si vous appelez SaveChanges une instruction SQL DELETE sera envoyée à la firebase database. Si aucune autre contrainte référentielle dans la firebase database n’est violée, l’entité sera supprimée, sinon une exception sera levée.

Je suis en fait un peu perplexe à propos de la section Notes de la page MSDN que vous avez liée car elle dit: ” Si la relation a une contrainte d’intégrité référentielle, l’appel de la méthode Remove sur un object dépendant marque la relation et l’object dépendant à supprimer. “. Cela me semble imprécis, voire inexact, car les trois cas ci-dessus ont une ” contrainte d’intégrité référentielle “, mais seulement dans le dernier cas, l’enfant est en fait supprimé. (À moins qu’ils ne signifient avec ” object dépendant ” un object qui participe à une relation d’identification, ce qui serait une terminologie inhabituelle.)

Si vous voulez vraiment utiliser Deleted, vous devrez rendre vos clés étrangères nulles, mais vous vous retrouverez avec des enregistrements orphelins (ce qui est l’une des principales raisons pour lesquelles vous ne devriez pas le faire). Alors, utilisez simplement Remove()

ObjectContext.DeleteObject (entity) marque l’entité comme supprimé dans le contexte. (C’est EntityState qui est supprimé après cela.) Si vous appelez SaveChanges après cela, EF envoie une instruction SQL DELETE à la firebase database. Si aucune contrainte référentielle dans la firebase database n’est violée, l’entité sera supprimée, sinon une exception sera levée.

EntityCollection.Remove (childEntity) marque la relation entre parent et childEntity comme supprimée. Si le childEntity lui-même est supprimé de la firebase database et que se passe exactement quand vous appelez SaveChanges, cela dépend du type de relation entre les deux:

Une chose à noter est ce paramètre .State = EntityState.Deleted ne déclenche pas de changement détecté automatiquement. ( archive )