【问题标题】:Entity Framework deletion issue实体框架删除问题
【发布时间】:2016-09-04 03:29:25
【问题描述】:

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

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

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

我环顾四周,几乎所有内容都表明我必须明确删除 Width 实体。

  1. 如果关系设置为级联删除,为什么我必须明确删除此记录?
  2. 我可以在我的表单不必引用上下文的情况下解决这个问题吗?我正在考虑处理 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 很好地解释了正在发生的事情。它为我的解决方案指明了方向。

标签: vb.net entity-framework


【解决方案1】:

我找到了一个解决方案,可以满足我的需求。我使用 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

感谢大家的帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-24
    • 1970-01-01
    相关资源
    最近更新 更多