实体框架删除问题

时间:2016-09-03 16:35:15

标签: vb.net entity-framework

我有一个简单的应用程序,它有2个表(tblGrade和tblWidth)。等级可以有多个宽度。我在sqlserver中将其设置为具有级联删除,并且还在edmx文件中的关系上设置了级联删除。外键不可为空。

我已将datagridview绑定到Widths集合。这工作正常,允许我添加,查看和删除记录,但是当我来保存更改时,我得到以下错误。

  

System.InvalidOperationException:操作失败:无法更改关系,因为一个或多个外键属性不可为空。当对关系进行更改时,相关的外键属性将设置为空值。如果外键不支持空值,则必须定义新关系,必须为外键属性分配另一个非空值,或者必须删除不相关的对象。

我做了一些环顾四周,几乎所有事情都指向我必须明确删除Width实体。

  1. 如果关系设置为级联删除,为什么我必须明确删除此记录?
  2. 如果我的表单不必引用上下文,我能解决这个问题。我正在考虑处理SavingChanges事件以删除孤立的宽度记录,但我不知道该怎么做。 (我的应用程序实际上有一个更嵌套的结构,但我已经将其删除了示例,我不想将上下文传递给每个控件或冒泡删除事件)。
  3. 我最欣赏任何想法/事物,因为我对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

1 个答案:

答案 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

感谢大家的帮助。