首先在Entity Framework数据库中级联删除

时间:2018-08-02 21:27:40

标签: c# asp.net-mvc entity-framework

我想在ASP.NET 4.6.1 MVC项目中删除Cascade,

这是数据库优先项目,但是级联删除无效。

我收到此错误:

  

操作失败:由于一个或多个外键属性不可为空,因此无法更改关系。
  更改关系后,相关的外键属性将设置为空值。
  如果外键不支持...

我有两个表:

类别:

Category_ID
Category_Name

文章:

Article_ID
Article_Name
Article_Content
Category_ID   which is Foreign key

这是我要删除的代码:

var context = new DbContext();

Category category = context.Category.First(c => c.CategoryID == catID);

if (category != null)
{
    context.Category.Remove(category);
    context.SaveChanges();
}

2 个答案:

答案 0 :(得分:0)

更新:对于db,首先转到应级联的实体的属性,然后找到属性End2 On Delete。将此设置为级联。

对于代码优先: 您可以在映射中定义要级联删除的关系。在您的数据上下文中,重写OnModelCreating并定义您的自定义映射。

我还没有测试代码,但是看起来应该像这样:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Article>()
            .HasRequired(a => a.Category)
            .WithMany(c => c.Articles)
            .HasForeignKey(a => CategoryId)
            .WillCascadeOnDelete();

    }

这个想法是在您的映射上调用WillCascadeOnDelete()

https://msdn.microsoft.com/en-us/library/gg696319(v=vs.113).aspx

答案 1 :(得分:0)

如果使用数据库优先方法,则首先需要为数据库中与Cascade的关系设置“删除规则”。

然后在程序中更新您的EF设计器。现在,以下代码将删除Category对象及其所有Articles:

如果(dbContext.Entry(categoryObj).State == System.Data.Entity.EntityState.Detached)                 dbContext.Categories.Attach(categoryObj);

dbContext.Categories.Remove(categoryObj);

dbContext.SaveChanges();