c# - 如何阻止 Entity Framework 尝试保存/插入子对象?

标签 c# entity-framework

当我用 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/

相关文章:

c# - 如何使用 LINQ 和 Entity Framework 6 进行表连接?

c# - 自动重新连接到互联网

c# - 以存储数据的属性为键的字典

c# - 强制中继到模拟框架

c# - 实体类型的 EF 映射属性到具有 TPH 继承的多个表

c# - MySQL 的 Linq To Entities DayOfYear 替代方案

c# - 从 C# 形式的 MySql 数据库读取二进制文件

c# - 将工具提示添加到数据 GridView 上的特定列

c# - 从字符串列名称动态创建 LINQ Select 表达式

entity-framework - 云互斥: Cloud based concurrency involving read/write to shared data (SQL data)