实体框架POCO - 可以设置Cascade吗?

时间:2013-06-29 12:32:53

标签: c# entity-framework poco cascade cascading-deletes

我有基本的递归类别,彼此之间是相互关联的。当我尝试删除有孩子的类别时,我会收到您的常见错误。

我一直做的是递归删除所有孩子的函数但我想知道我能不能以某种方式将 CASCADE ON DELETE 设置为使用EF的POCO类,所以我不需要实现我的自己的删除机制?

错误

  

DELETE语句与SAME TABLE REFERENCE冲突   约束“FK_dbo.Categories_dbo.Categories_RootCategoryId”。该   数据库“网站”,表“dbo.Categories”中发生冲突,   列'RootCategoryId'。

模型

public class Category
{
    public int Id { get; set; }

    public int? RootCategoryId { get; set; }
    public virtual Category RootCategory { get; set; }
    public virtual ICollection<Category> ChildCategories { get; set; }
}

我现在拥有什么

目前我在删除类别前删除了关系。但是,如果我想以递归方式删除所有子类别呢?只有级联它们才能实现这一点。

public ActionResult Delete(int id)
{
    var category = _db.Categories.Single(x => x.Id == id);
    if (category.RootCategoryId == null)
    {
        category.ChildCategories.ToList().ForEach(x => x.RootCategoryId = null);
    }
    else
    {
        category.ChildCategories.ToList().ForEach(x => x.RootCategoryId = category.RootCategoryId);
    }
    _db.Categories.Remove(category);
    _db.SaveChanges();
    return RedirectToAction("Index", "Category");
}

1 个答案:

答案 0 :(得分:1)

我接触这个问题的方法是使用OnModelCreating Fluent api。

protected override void OnModelCreating(System.Data.Entity.ModelConfiguration.ModelBuilder modelBuilder)
{
    modelBuilder.Entity()
        .HasMany(u => u.ProjectAuthorizations)
        .WithRequired(a => a.UserProfile)
        .WillCascadeOnDelete(true);

}