我有一个简单的应用程序,它有2个表(tblGrade和tblWidth)。等级可以有多个宽度。我在sqlserver中将其设置为具有级联删除,并且还在edmx文件中的关系上设置了级联删除。外键不可为空。
我已将datagridview绑定到Widths集合。这工作正常,允许我添加,查看和删除记录,但是当我来保存更改时,我得到以下错误。
System.InvalidOperationException:操作失败:无法更改关系,因为一个或多个外键属性不可为空。当对关系进行更改时,相关的外键属性将设置为空值。如果外键不支持空值,则必须定义新关系,必须为外键属性分配另一个非空值,或者必须删除不相关的对象。
我做了一些环顾四周,几乎所有事情都指向我必须明确删除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
答案 0 :(得分:0)
我找到了一个能够完成我所追求的解决方案。我使用SavingChanges事件来检测子实体是否没有父实体,然后我调用delete。这样我的代码就可以免费使用实体而无需引用上下文。
Partial Public Class ProductionDataEntities
Private Sub OnSavingChanges(sender As Object, e As EventArgs) Handles Me.SavingChanges
For Each entry As ObjectStateEntry In ObjectStateManager.GetObjectStateEntries(EntityState.Modified)
Dim gradeWidth = TryCast(entry.Entity, GradeWidth)
If gradeWidth IsNot Nothing Then
If gradeWidth.Grade Is Nothing Then
Me.DeleteObject(gradeWidth)
End If
End If
Next
End Sub
End Class
感谢大家的帮助。