Entity Framework - Effacer une collection enfant

entity-framework

Question

J'ai rencontré un problème intéressant avec Entity Framework et, en me basant sur le code que je devais utiliser pour le résoudre, je soupçonne que ma solution est loin d'être idéale. J'ai une relation un-à-plusieurs entre la table A et la table B, où les entités de la table B font référence à la tableA. J'ai un scénario dans lequel je veux supprimer simultanément tous les enfants d'une ligne dans TableA et j'ai pensé que cela pourrait être réalisé simplement en effaçant la collection:

Entity.Children.Clear()

Malheureusement, lorsque j'ai tenté de sauvegarder les modifications apportées, il s'agissait d'une violation de clé étrangère.

Une relation est ajoutée ou supprimée d'un AssociationSet 'FK_EntityB_EntityA'. Avec des contraintes de cardinalité, un «EntityB» correspondant doit également être ajouté ou supprimé.

La solution que j'ai proposée consistait à supprimer manuellement un objet via la propriété DeleteObject () du contexte de l'entité, mais je sais que la logique que j'utilise doit être fausse.

while (collection.Any())
    Entities.DeleteObject(collection.First());

D'une part, le fait que je devais utiliser une boucle Where () semble bien moins qu'idéal, mais je suppose que c'est une évaluation purement sémantique de ma part. Quoi qu'il en soit, y a-t-il quelque chose qui cloche dans ma façon de procéder, ou existe-t-il un meilleur moyen d'effacer une collection d'entités enfant d'une entité de telle sorte qu'Entity Framework appelle correctement une suppression de magasin de données sur tous les objets supprimés?

Réponse acceptée

Clear() supprime la référence à l'entité, pas l'entité elle-même.

Si vous souhaitez que cela soit toujours la même opération, vous pouvez gérer AssociationChanged :

Entity.Children.AssociationChanged += 
    new CollectionChangeEventHandler(EntityChildrenChanged);
Entity.Children.Clear();            

    private void EntityChildrenChanged(object sender,
        CollectionChangeEventArgs e)
    {
        // Check for a related reference being removed. 
        if (e.Action == CollectionChangeAction.Remove)
        {
            Context.DeleteObject(e.Element);
        }
    }

Vous pouvez intégrer cela à votre entité en utilisant une classe partielle.


Réponse populaire

Vous pouvez créer une relation d'identification entre les entités parent et enfant et EF supprimera l'entité enfant lorsque vous la supprimerez de la collection parent.

    public class Parent
    {
      public int ParentId {get;set;}
      public ICollection<Child> Children {get;set;}
    }

    public class Child
    {          
      public int ChildId {get;set;}
      public int ParentId {get;set;}
    }

Configuration de la cartographie:

    modelBuilder.Entity<Child>().HasKey(x => new { x.ChildId, x.ParentId });
    modelBuilder.Entity<Parent>().HasMany(x => x.Children).WithRequired().HasForeignKey(x => x.ParentId);


Related

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