如何设置我的域和LINQ语句,以便从数据库中删除记录?
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; }
}
我想要做的是删除类别,并能够将删除级联到所有子产品。
这是唯一的方法吗?
Category category = new Category() { CategoryId = 1 } ;
context.AttachTo("Category", category);
context.DeleteObject(category);
context.Savechanges();
答案 0 :(得分:41)
您首先提到EF代码,这意味着EF 4.1,但您已经显示了在EF 4中删除对象的示例。在不从数据库加载对象的情况下删除EF 4.1中的对象的正确方法是:
var category = new Category() { CategoryId = 1 };
context.Categories.Attach(category);
context.Categories.Remove(category);
context.SaveChanges();
如果您没有更改defalut约定配置中的任何内容,它也会删除所有相关产品,因为OneToManyCascadeDeleteConventions
可确保使用ON CASCADE DELETE
创建所有一对多关系。数据库没有额外的往返 - 只有DELETE
的单Category
个语句Id
= 1。
如果要删除完全加载的Category
(带有加载的Products
导航属性),可能会出现不同的情况,在这种情况下,EF将为每个Product
创建单独的删除语句,这样您就可以有N + 1次往返数据库,其中N是类别中的产品数量。 Here是级联删除在EF中的工作方式。它与实体设计师有关,但描述的原则是相同的。
答案 1 :(得分:3)
取自VS2010自动生成的代码:
Category category = db.Categories.Find(id);
db.Categories.Remove(category);
db.SaveChanges();