Comment faire pour supprimer enfant de un à plusieurs enregistrements liés dans EF premier code de base de données?
Bien, j'en ai une-à-plusieurs modèle:
public class Parent
{
public int Id { get; set; }
public string Name { get; set; }
public ICollection<Child> Children { get; set; }
}
public class Child
{
public int Id { get; set; }
public string ChildName { get; set; }
}
Ce que je veux faire, c'est clair Parent.Children
et de supprimer d'un enfant dans des entités de la base de données. J'ai déjà essayé:
Contexte de base de données de la classe:
modelBuilder.Entity<Parent>()
.HasMany(p => p.Children)
.WithOptional()
.WillCascadeOnDelete(true);
cela fonctionne bien, mais j'ai toujours redondant enregistrements dans la base de données avec Parent_Id = null
champs quand je fais
parent.Children.Clear();
repository.InsertOrUpdate(parent);
dans ma classe de référentiel. Également le même comportement, c'est quand je fais:
modelBuilder.Entity<Parent>()
.HasMany(pr => pr.Children)
.WithOptional(ri => ri.Parent)
.WillCascadeOnDelete(true);
avec d'autres Parent
propriété dans Child
classe
public class Child
{
...
public Parent Parent { get; set; }
...
}
ou quand je le fais
modelBuilder.Entity<Child>()
.HasOptional(p => p.Parent)
.WithMany(p => p.Children)
.HasForeignKey(p => p.Parent_Id)
.WillCascadeOnDelete(true);
avec d'autres Parent_Id propriété dans Child
classe
public class Child
{
...
public int Parent_Id { get; set; }
...
}
Alors, comment puis-je configurer cascade de supprimer correctement? Ou comment dois-je censé supprimer ces enfants? Je suppose que c'est occasionnel de travail, mais je suis juste en manque de quelque chose.
- Pouvez-vous poster un peu plus de code? Peut-être que la totalité du contenu de votre
OnModelCreating()
? Quand j'ai copier-coller de vos entités et votre première tentative de cartographie (et de définirId
comme la propriété de clé pour les deux entités), les suppressions en cascade correctement pour moi.
Vous devez vous connecter pour publier un commentaire.
De suppression en cascade n'a pas d'effet ici parce que vous ne supprimez pas les
parent
mais appelez simplementInsertOrUpdate
. La procédure correcte est d'effacer les enfants un par un, comme par exemple:context.Children.RemoveRange(parent.Children.ToArray())
de cette façon, le DbContext n'a pas à faire beaucoup de travail de vérifier chaque fois que vous appelez Supprimer. Cela peut ne pas être un gros problème de performance pour les suppressions, mais j'ai remarqué une énorme différence lors de l'ajout d'éléments à un moment où j'ai testé l'ajout de 100 enregistrements à l'aide d'context.Children.Add(child)
dans une boucle for.ON DELETE CASCADE
et de générer DB-modèles de nouveau laDeleteBehavior.Cascade
en eux.Dans EF6 un moyen plus rapide de faire l'opération est...
parent.Id == 10
, et monChild
classe a 100 champs et n'avez pas chargé de mémoire encore, il semble inefficace d'utiliserRemoveRange
parce que le programme aura pour chargeparent.Children
avec tous les 100 champs par défaut.var child = context.Children.Single(f=>f.Id==childId); var parent = context.Parents.Single(f=>f.Id==child.ParentId);
Ce qui est appelé "la suppression des orphelins".
Peut EF supprimer automatiquement les données orphelin, lorsque le parent n'est pas supprimé?
Je ne sais pas comment cela fonctionne dans EF6 mais en EF de Base, il fonctionne très bien https://docs.microsoft.com/en-us/ef/core/saving/cascade-delete de sorte que vous n'avez pas nécessairement besoin de supprimer le parent pour les cascades de travail.
Supprimer les orphelins des exemples
Essayez de changer de
parce que virtuelle est nécessaire pour obtenir un chargement différé.
comme expliqué
ici
Je pense que votre parent.Les enfants.claire ne fonctionne pas parce que les Enfants n'ont pas été chargés
Si votre objet est l'auto-référencement, vous pouvez supprimer plusieurs-à-plusieurs et un-à-plusieurs enfants à l'aide de la méthode ci-dessous. N'oubliez pas d'appeler db.SaveChanges() par la suite 🙂