【问题标题】:Error Deleting a child object from its parent从父对象中删除子对象时出错
【发布时间】:2018-02-14 19:40:08
【问题描述】:

我正在使用 vb.net 2013、Entity Framework 6 和 SQL Server 2008 R2。

我正在尝试从子实体中删除,但这不起作用。但是,如果我尝试直接从上下文中删除,这是可行的。

在我的数据库中,我有 2 个表 StudentsResult

这是我的代码不起作用:

Dim context as Myentities = New myentities.
Dim s as student.
Dim lresult as new list (of result)

s = context.students.where(Function(t1) t1.value>5).Tolist.first

lresult = (from t in s.results where t.vl2=7 select t).Tolist

for each rs as result in lresult
   if rs.vl3=11 then s.results.remove(rs)
Next

Context.SaveChanges

此代码在最后一行产生错误 (context.SaveChanges):

EntityFramework.dll 中出现“System.InvalidOperationException”类型的未处理异常
附加信息:操作失败:无法更改关系,因为一个或多个外键属性不可为空。当对关系进行更改时,相关的外键属性将设置为空值。如果外键不支持空值,则必须定义新关系,必须为外键属性分配另一个非空值,或者必须删除不相关的对象。

但如果我更改删除项目的行,如下所示,它可以工作:

Dim context as Myentities = New myentities.
Dim s as student.
Dim lresult as new list (of result)

s = context.students.where(Function(t1) t1.value>5).Tolist.first
lresult = (from t in s.results where t.vl2=7 select t).Tolist

for each rs as result in lresult
   if rs.vl3=11 then context.results.remove(rs)
Next

Context.SaveChanges

为什么我的第一个 sn-p 代码不起作用?

【问题讨论】:

    标签: vb.net entity-framework entity-framework-6


    【解决方案1】:

    我猜你定义了StudentsResults 之间的关系,方法是在ResultsStudents 中添加一个Foreign Fey,这是一个名为StudentId 或类似名称的不可为空的字段。当您从Results 的父Student 集合中执行Remove 时,EF 并没有真正从上下文中删除已删除的Result,EF 只是删除它们之间的关系并在您的@ 中设置StudentId 值987654332@child 为 null,但孩子仍保留在上下文中。所以你得到一个无法保存的孤儿,因为 FK 字段为空。

    问题在于您的关系在概念上是一种识别关系,这意味着您不能拥有不属于StudentResult。但英孚认为你们的关系是非识别性的。

    你有两个选择:

    • 通过将外键字段StudentId 添加到Results 的主键中,使EF 将该关系识别为标识关系。您将拥有一个复合键。这样,当您从父项的集合中删除子项时,EF 将负责从上下文中删除子项。
    • 保持 PK 不变,并在保存前从上下文中显式删除子项。也就是说,您同时执行来自父集合的 Removecontext.Remove

    通常首选第二个选项,因为复合键在 EF 中处理起来有点复杂。您可以编写一个方法来封装每次从Student 中删除Result 时应该一起执行的两个操作。

    有关识别关系here 的更多信息。

    【讨论】:

      猜你喜欢
      • 2021-11-11
      • 1970-01-01
      • 2019-11-25
      • 2021-07-23
      • 1970-01-01
      • 1970-01-01
      • 2021-04-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多