【发布时间】:2019-05-22 07:29:56
【问题描述】:
当我使用实体框架保存实体时,我自然认为它只会尝试保存指定的实体。但是,它也在尝试保存该实体的子实体。这会导致各种完整性问题。如何强制 EF 仅保存我要保存的实体,从而忽略所有子对象?
如果我手动将属性设置为 null,则会收到错误消息“操作失败:无法更改关系,因为一个或多个外键属性不可为空。”这是非常适得其反的,因为我专门将子对象设置为 null 以便 EF 不理会它。
我为什么不想保存/插入子对象?
由于这在 cmets 中反复讨论,我将给出一些理由说明为什么我希望我的子对象不被打扰。
在我正在构建的应用程序中,EF 对象模型不是从数据库中加载的,而是用作我在解析平面文件时填充的数据对象。在子对象的情况下,其中许多是指定义父表的各种属性的查找表。例如,主要实体的地理位置。
由于我自己填充了这些对象,EF 假定这些是新对象并且需要与父对象一起插入。但是,这些定义已经存在,我不想在数据库中创建重复项。我只使用 EF 对象进行查找并在我的主表实体中填充外键。
即使子对象是真实数据,我也需要先保存父对象并获取主键,否则 EF 似乎会把事情弄得一团糟。希望这能给出一些解释。
【问题讨论】:
-
据我所知,您必须将子对象设为空。
-
嗨,约翰。不工作。如果我将集合设为空,它会引发错误。根据我的操作方式,它会抱怨键为空或我的集合已被修改。显然,那些事情是真实的,但我是故意这样做的,所以它不会留下它不应该接触的物体。
-
欣快,这完全没有帮助。
-
@Euphoric 即使不更改子对象,EF 仍会默认尝试插入它们,而不是忽略或更新它们。
-
真正让我烦恼的是,如果我特意将这些对象归零,它会抱怨而不是意识到我希望它不理会它们。由于这些子对象都是可选的(在数据库中可以为空),是否有某种方法可以强制 EF 忘记我拥有这些对象?即以某种方式清除其上下文或缓存?
标签: c# entity-framework