【发布时间】:2013-06-27 03:24:13
【问题描述】:
我有相互关联的基本递归类别。当我尝试删除具有子项的类别时,我得到了您通常的错误。
我一直做的是创建一个函数来递归删除所有孩子,但我想知道我是否可以以某种方式将 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");
}
【问题讨论】:
-
我不确定这是否可行,因为没有什么能阻止
Category在关系中的某个地方,路径对自身的引用,引入循环级联。我远不是 Model First 方面的专家,但如果这在 Code First 中可行,您需要在 ModelBuilder 中指定 CascadeOnDelete。见:stackoverflow.com/questions/10523291/…
标签: c# entity-framework poco cascade cascading-deletes