web-dev-qa-db-fra.com

Le code cadre d'entité est d'abord supprimé avec une cascade

Comment configurer mon domaine et l'instruction LINQ pour pouvoir supprimer un enregistrement d'une base de données?

public class Category    {
    public int CategoryId { get; set; }
    public string Name { get; set; }

    public List<Product> Products{ get; set; }

}
public class Product {
    public int ProductId { get; set; }
    public string Name { get; set; }

    public int CategoryId {get; set; }
    public Category Category{ get; set; }
}

Ce que j'aimerais faire, c'est supprimer la catégorie et pouvoir appliquer la suppression en cascade à tous les produits enfants.

  1. Y a-t-il d'autres attributs supplémentaires nécessaires dans mon domaine?
  2. Qu'est-ce que l'instruction LINQ pour supprimer des objets sans effectuer un aller-retour? (Je ne veux pas sélectionner, juste une suppression directe).

Est-ce la seule façon de procéder?

Category category = new Category() {  CategoryId = 1   } ; 
context.AttachTo("Category", category);
context.DeleteObject(category);
context.Savechanges();
26
Shawn Mclean

Vous avez mentionné le code EF en premier, ce qui signifie EF 4.1, mais vous avez montré un exemple de suppression d'objet dans EF 4. L'approche correcte pour supprimer un objet dans EF 4.1 sans le charger à partir de la base de données est:

var category = new Category() { CategoryId = 1 };
context.Categories.Attach(category);
context.Categories.Remove(category);
context.SaveChanges();

Si vous n'avez rien modifié dans la configuration des conventions par défaut, il supprimera également tous les produits associés, car OneToManyCascadeDeleteConventions garantit que toutes les relations un à plusieurs sont créées avec ON CASCADE DELETE. Il n'y aura pas d'allers-retours supplémentaires vers la base de données - une seule instruction DELETE pour Category avec Id = 1.

La situation différente peut se produire si vous souhaitez supprimer Category complètement chargé (avec la propriété de navigation Products chargée) dans ce cas, EF créera une instruction de suppression distincte pour chaque Product afin que vous avoir N + 1 allers-retours à la base de données où N est le nombre de produits dans la catégorie. Ici est le fonctionnement de la suppression en cascade dans EF. Il est lié au concepteur d'entité mais les principes décrits sont les mêmes.

41
Ladislav Mrnka

Tiré du code généré automatiquement VS2010:

Category category = db.Categories.Find(id);
db.Categories.Remove(category);
db.SaveChanges();
3
Vasil Popov