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.
Est-ce la seule façon de procéder?
Category category = new Category() { CategoryId = 1 } ;
context.AttachTo("Category", category);
context.DeleteObject(category);
context.Savechanges();
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.
Tiré du code généré automatiquement VS2010:
Category category = db.Categories.Find(id);
db.Categories.Remove(category);
db.SaveChanges();