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

Sha*_*ean 26 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; }
}
Run Code Online (Sandbox Code Playgroud)

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

  1. 我的域名中是否还需要其他任何其他属性?
  2. 没有进行往返的删除对象的LINQ语句是什么?(我不想选择,只是直接删除).

这是唯一的方法吗?

Category category = new Category() {  CategoryId = 1   } ; 
context.AttachTo("Category", category);
context.DeleteObject(category);
context.Savechanges();
Run Code Online (Sandbox Code Playgroud)

Lad*_*nka 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();
Run Code Online (Sandbox Code Playgroud)

如果您没有更改defalut约定配置中的任何内容,它也将删除所有相关产品,因为OneToManyCascadeDeleteConventions确保创建所有一对多关系ON CASCADE DELETE.不会有任何额外的往返到数据库-只有单一DELETE的语句CategoryId= 1.

如果要删除完全加载Category(带有加载的Products导航属性),则会出现不同的情况.EF会为每个创建单独的删除语句,Product因此您将有N + 1往返数据库,其中N是类别中的产品数.以下是级联删除在EF中的工作原理.它与实体设计师有关,但描述的原则是相同的.

  • 这在EF4.1,4.3或5.0中从未对我有用.试图以这种方式删除一个EF Code First实体,一对多的孩子一直得到我的异常:DELETE语句与REFERENCE约束"FK_dbo.ChildTable_dbo.ParentTable_Parent_Id"冲突.冲突发生在数据库"Database",表"dbo.ChildTable",列"Parent_Id"中.该语句已终止. (2认同)