【问题标题】:Entity Framework POCO - Possible to set Cascade?实体框架 POCO - 可以设置级联吗?
【发布时间】: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


【解决方案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);

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-21
    • 1970-01-01
    • 1970-01-01
    • 2011-04-05
    • 1970-01-01
    • 2012-03-08
    • 1970-01-01
    • 2012-03-22
    相关资源
    最近更新 更多