Entity Framework数据库优先中的级联删除

5

我希望在ASP.NET 4.6.1 MVC项目中实现级联删除,这是一个数据库优先的项目,但级联删除无法正常工作。

我遇到了以下错误:

操作失败:无法更改关系,因为其中一个或多个外键属性是非空的。
当关系发生变化时,相关的外键属性将设置为空值。
如果外键不支持...

我有两张表:

Category:

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

1
你需要向我们展示你的表格/代码,这样我们才能帮助你。但错误信息非常明显,你有一个非空的外键关系。因此,如果你删除记录,外键关系将变得无效。 - Hooman Bahreini
我编辑了我的问题,但为什么级联删除没有起作用? - MrMustafa
1
但是当我删除该类别时,我想要删除所有与特定类别相关的文章!!! - MrMustafa
2
不是,它是数据库优先的,我的问题标题是“数据库优先”。 - MrMustafa
2
你能改变你的数据库模式吗?比如为你的外键添加“ON DELETE CASCADE”? - JleruOHeP
显示剩余4条评论
2个回答

0

更新:对于数据库优先,请转到应该级联的实体的属性并找到属性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
这个问题是关于数据库优先还是代码优先的解决方案?问题指定了数据库优先。 - tamj0rd2
1
这是针对 Code First 的。对于 Db First,Visual Studio 设计器中有选项来设置此属性。我会更新答案。 - dexter
提问者正在询问EF数据库优先级中的级联删除,但回答是针对代码优先级的方法! - gyousefi
2
@PureSilence 不是的!答案中的第一段是针对数据库优先的。之后它提供了Code First的答案。 - dexter
是的,你说得对!无论如何,那是一个很好的答案,谢谢你注意到我了! - gyousefi
很不幸,这并不是最有用的答案。已经有关于Code First的问题了。而顶部关于Data First的注释也不足以作为一个答案。 - speciesUnknown

-1
如果您正在使用数据库优先的方法,首先需要在数据库中设置关系的删除规则为级联。
然后,在程序中更新您的EF设计器。现在,以下代码将删除Category对象及其所有的文章:
if (dbContext.Entry(categoryObj).State == System.Data.Entity.EntityState.Detached)
                dbContext.Categories.Attach(categoryObj);

dbContext.Categories.Remove(categoryObj);

dbContext.SaveChanges();

你如何在数据库中“设置关系的删除规则为级联”? - speciesUnknown
您可以在ssms(SQL Server Management Studio)中简单地设置当前两个表之间的外键约束为On Delete Cascade规则,如果您想通过T-SQL脚本执行此操作,则首先必须使用ALTER命令删除当前的外键约束,然后:ALTER TABLE Article ADD CONSTRAINT Category_Article FOREIGN KEY (Category_ID) REFERENCES Category(Category_ID) ON DELETE CASCADE; - gyousefi
这可能是答案的一个不错的补充。 - speciesUnknown

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接