当我用 Entity Framework 保存一个实体时,我很自然地假设它只会尝试保存指定的实体。但是,它也在尝试保存该实体的子实体。这导致了各种完整性问题。我如何强制 EF 仅保存我想要保存的实体并因此忽略所有子对象?
如果我手动将属性设置为空,我会收到错误消息“操作失败:无法更改关系,因为一个或多个外键属性不可为空。”这会适得其反,因为我专门将子对象设置为 null,因此 EF 不会理会它。
为什么我不想保存/插入子对象?
由于这个问题在评论中来回讨论,我将给出一些理由来说明为什么我希望我的子对象不受干扰。
在我正在构建的应用程序中,EF 对象模型不是从数据库中加载的,而是用作我在解析平面文件时填充的数据对象。在子对象的情况下,其中许多是指定义父表的各种属性的查找表。例如,主要实体的地理位置。
由于我自己填充了这些对象,EF 假定这些是新对象并且需要与父对象一起插入。但是,这些定义已经存在,我不想在数据库中创建重复项。我只使用 EF 对象进行查找并在我的主表实体中填充外键。
即使子对象是真实数据,我也需要先保存父对象并获取主键,否则 EF 似乎只会把事情搞得一团糟。希望这能给出一些解释。
最佳答案
据我所知,您有两个选择。
选项 1)
清空所有子对象,这将确保 EF 不添加任何内容。它也不会从您的数据库中删除任何内容。
选项 2)
使用以下代码将子对象设置为与上下文分离
context.Entry(yourObject).State = EntityState.Detached
请注意,您不能分离List
/Collection
。您将必须遍历列表并像这样分离列表中的每个项目
foreach (var item in properties)
{
db.Entry(item).State = EntityState.Detached;
}
关于c# - 如何阻止 Entity Framework 尝试保存/插入子对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25441027/