【发布时间】:2016-09-04 03:29:25
【问题描述】:
我有一个简单的应用程序,它有 2 个表(tblGrade 和 tblWidth)。等级可以有多个宽度。我在 sqlserver 中将其设置为具有级联删除,并且我还在 edmx 文件中的关系上设置了级联删除。外键不可为空。
我已将 datagridview 绑定到 Widths 集合。这工作正常,允许我添加、查看和删除记录,但是当我保存更改时,我收到以下错误。
System.InvalidOperationException:操作失败:无法更改关系,因为一个或多个外键属性不可为空。当对关系进行更改时,相关的外键属性将设置为空值。如果外键不支持空值,则必须定义新关系,必须为外键属性分配另一个非空值,或者必须删除不相关的对象。
我环顾四周,几乎所有内容都表明我必须明确删除 Width 实体。
- 如果关系设置为级联删除,为什么我必须明确删除此记录?
- 我可以在我的表单不必引用上下文的情况下解决这个问题吗?我正在考虑处理 SavingChanges 事件以删除孤立的 Width 记录,但我不知道该怎么做。 (我的应用实际上有一个更嵌套的结构,但我已将其缩减为示例,我不喜欢将上下文传递给每个控件或冒泡删除事件)。
由于我对 EntityFramework 还是很陌生,因此我将不胜感激任何要查看的想法/事情。
Using ctxt As New ProductionDataEntities
Dim grade = ctxt.Grades.First()
Dim width = grade.GradeWidths(0)
grade.GradeWidths.Remove(width)
'ctxt.DeleteObject(width) **** will pass if this is uncommented.
ctxt.SaveChanges()
End Using
详细信息:EF5 - Db First、SqlServer 2012、vb.net 2010
【问题讨论】:
-
grade.GradeWidths.Remove(width) 表示:从等级的导航属性中删除宽度,因此将 FK 从宽度到等级设置为 NULL... 它不能这样做,因为 FK 不是可以为空。级联删除在这里不起作用,因为实际上没有删除任何内容......只是 FK 被 EF 修改。唯一的可能性是实际删除宽度 - 与您当前的相比,这实际上不会导致额外的数据库调用。
-
感谢@DevilSuichiro 很好地解释了正在发生的事情。它为我的解决方案指明了方向。