【问题标题】:The relationship could not be changed because one or more of the foreign-key properties is non-nullable. When Inserting a new Entity无法更改关系,因为一个或多个外键属性不可为空。插入新实体时
【发布时间】:2015-10-08 01:56:38
【问题描述】:

尝试通过 EF 6.1.1 插入新实体及其关系时出现以下错误。

注意

我已禁用延迟加载和代理创建。

无法更改关系,因为其中一项或多项 外键属性不可为空。当对某项进行更改时 关系,相关的外键属性设置为空值。 如果外键不支持空值,一个新的关系 必须定义,外键属性必须分配另一个 非空值,否则必须删除不相关的对象。

我已经仔细检查了所有的导航属性,它们都被考虑在内,而不是为空。

我还从对象图中删除了所有子实体,但仍然遇到相同的错误。与其他表/实体仍然存在 FK 关系,但我可以看到它们都已解决。 IE。在调用 AddObject 之后但在 SaveChanges 之前,我可以看到所有关系都已根据相关的 FK Id 得到解决/水合。不过,这些只是对现有数据的查找。

所以我不明白什么关系被设置为 null 以及为什么

我有其他实体可以正常保存,但这个特定实体无法正常工作。

我应该寻找什么?

如果有的话,我应该提供哪些更多信息来帮助解释问题?

编辑 1

已按照史蒂夫的建议和这篇文章https://msdn.microsoft.com/en-us/data/dn469464.aspx#Log.Logging 开启了登录,但生成的唯一语句是打开的连接,当我调用保存更改时,我没有生成其他语句。我也运行了 SQL Profiler,这里也没有生成语句!

编辑 2

这是相关表的数据库图。我尝试为其创建记录的主表是 WorkOrders 表。 Users、RefList、Employees 和 ActivePolicies 仅用于此上下文中的参考数据。

我通过分配 Id 属性而不是导航属性来设置 FK 属性。

它还应该将数据插入 WorkOrdersWorkOrderEmployeesWorkOrderEmployeeArtifactsWorkOrderEmployeePolicies。虽然如果我 NOT 将这些添加到 WorkOrders 实体并且只创建没有子级的 WorkOrders 实体,我仍然会遇到相同的错误。

提前致谢, 皮特

【问题讨论】:

  • @SteveGreene 谢谢,但没有产生任何声明。 EF必须在保存之前进行一些内部检查吗?请参阅上面的编辑。
  • 嗨@Pete,能否请您显示您的数据库图表以及您尝试在哪个表中添加数据。插入时如何分配外键关系?
  • @AbhilashPA。见编辑 2
  • 设置关联可以“窃取”一个实体远离另一个实体,从而使现有外键无效。我认为这就是这里发生的事情。

标签: c# entity-framework


【解决方案1】:

所以最终它完全是附加到我正在使用的上下文中的其他东西,与我试图保存的实体无关。

我是怎么发现的?

最后,我想我会删除与父实体 WorkOrders 之间的所有关系,然后将它们一一添加回来,看看哪个被破坏了......但只要我这样做我仍然得到同样的错误。

深入研究我使用的上下文,我发现在 modifiedEntityStore 中有一堆实体,在 _entriesWithConceptualNulls 中有相同数量的实体。查看这些条目让我意识到,在收集保存 WorkOrders 实体所需的参考数据时,我在代码库中进一步出现了逻辑错误。

无论如何...经验教训...确保检查 EF 上下文中的其他内容并尝试保存。

感谢大家的帮助

皮特

【讨论】:

    【解决方案2】:

    我通过分配 Id 属性而不是导航属性来设置 FK 属性。

    看图,表中除Users以外的所有FK字段/列都命名为Id吗? Id 是否也作为 sub-object/table 的 PK 服务?

    这令人困惑!

    我相信要解决这个问题,您应该重新构建表以将命名为 PK 的名称命名为 WorkOrdersID,然后将 UsersId 列作为 FK。


    然后在保存/提交之前完整地设置对象的导航属性。不必直接担心 FK 的 id。保存完成后,由于已填充导航对象,EF 将填充 Id 的值。

    【讨论】:

      猜你喜欢
      • 2015-12-16
      • 1970-01-01
      • 2013-10-19
      • 2014-04-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多