实体框架代码首先用级联删除

时间:2011-04-02 01:07:24

标签: entity-framework ef-code-first

如何设置我的域和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; }
}

我想要做的是删除类别,并能够将删除级联到所有子产品。

  1. 我的域名中是否还需要其他其他属性?
  2. 在不进行往返的情况下删除对象的LINQ语句是什么? (我不想选择,只是直接删除)。
  3. 这是唯一的方法吗?

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

2 个答案:

答案 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();