EntityCollection Clear() et Remove() méthodes
Quelle est la bonne façon de supprimer tous les articles de la collection d'un EF entité? Dans le code ci-dessous, DocumentItems est la collection de document les éléments d'un document. Ce code proceedes sur Clear() mais échoue sur SaveChanges() parce que les éléments associés sont connectés à leur document par l'intermédiaire de FK et FK est obligatoire. Donc je suppose qu'ils en quelque sorte rester flotter dans l'air sans une clé étrangère après Clear().
Puis-je résoudre ce avec une boucle foreach sur la collection d'appel Remove() sur chaque élément ou est-il un autre moyen?
//remove existing document items to prepare for refreshing them
existing.DocumentItems.Clear();
//adds new Document Items
PrepareInvoice(existing, collection);
_repository.SaveChanges();
OriginalL'auteur mare | 2010-10-06
Vous devez vous connecter pour publier un commentaire.
C'est une manière de supprimer des éléments dans la collection.
VB
C#
Alors vous devez faire appel
Je pense que EF 6 a une nouvelle méthode appelée RemoveRange je n'ai pas réellement utilisé mais voici un lien à quelqu'un qui a : ). stackoverflow.com/questions/21568479/...
RemoveRange fixe. Merci.
OriginalL'auteur Brian Rizo
Clair supprime juste la référence, mais ne supprime pas le entiy.
Dans votre situation
Tous DocumentItems dans l'EntitySet obtiendrez compensés, mais vous aurez à Supprimer/Supprimer le DocumentItem ou de s'engager avec l'échec, tout de même, comme il le ferait si vous avez essayé de supprimer dans la base de données.
Vous avez besoin de faire une boucle par se détacher de toutes les références, puis supprimer l'entité que vous souhaitez supprimer (à moins que son nullable et dans votre situation, il ne l'est pas)
Sinon, j'ai vu des implémentations qui utilisent clair, et un AssociationChangedHandler pour supprimer automatiquement l'ancien objet. En gros, si le changement est un "supprimer/supprimer", il appelle DeleteObject() sur l'objet orphelin.
Clear
est pas claire. Ma compréhension est qu'ils sont différents. Claire dit juste supprimer le pointeur (en mémoire) de ces objets.Remove
dit supprimer de ma liste et marquer pour suppression... s'il vous plaît corrigez-moi si j'ai rien dit non valide.OriginalL'auteur Nix
Astuce: Lors de la configuration de la relation entre le Parent et l'Enfant, vous aurez À créer un "composite" clé de l'enfant. De cette façon, lorsque vous dites à la Mère de supprimer 1 ou la totalité de ses enfants, les enregistrements seront effectivement supprimés de la base de données.
Pour configurer la clé composite à l'aide API Fluent:
Ensuite, pour supprimer la relative enfants:
Fait!
OriginalL'auteur Mosh
Oui, depuis un an, mais sur une note mineure... depuis DeleteObject prend un paramètre, qui est du même type que l'argument de l'expression lambda, vous pouvez simplement utiliser:
Je ne suis pas sûr si visual basic prend en charge une syntaxe similaire, bien que. Quelqu'un?
OriginalL'auteur Dave Parker
Juste pour répondre à Nix commentaire à la réponse,
il me semble que la EntityCollection.Méthode Remove seulement les marques pour la suppression des relations et non pas les entités, tout comme le EntityCollection.Méthode claire.
Je sais que la documentation indique que l'entité sera marqué pour suppression, mais dans mon test j'ai eu le comportement que j'ai décrit (quelqu'un peut m'expliquer pourquoi?).
Donc, si vous en avez un à de nombreux contrainte de clé étrangère dans le modèle conceptuel, vous ne pouvez pas enregistrer les modifications pour le contexte, dans le magasin de persistance.
Le seul moyen que j'ai trouvé (car je ne veux pas CascadeDelete) est une boucle à travers les enfants, et d'invoquer le contexte.DeleteObject sur chacun d'eux, supprimant ainsi l'entité et de la relation.
OriginalL'auteur ilmatte