1

我有相互关联的基本递归类别。当我尝试删除一个有孩子的类别时,我得到了你通常的错误。

我一直做的是创建一个函数来递归删除所有孩子,但我想知道我是否可以以某种方式将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");
}
4

1 回答 1

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);

}
于 2013-06-29T18:14:33.077 回答