保存父实体时,新的子实体将不会保存

2024-01-17

我有一个父实体

foo存在于数据库中,我有一个属性bar在此实体上(一对多关系)。

Foo已分离,因为它使用 WebApi 进行反序列化,所以我这样做是为了foo

context.Foos.AddOrUpdate(foo);

就算有新的bar附加到它的引用,它不会被保存,但是对于我们拥有的另一个关系(多对多关系)来说,它确实像这样工作。如果我向该集合添加一个新实体,它将被保存到其表中,并且还会向关系表中添加一行。

If I do context.Bars.AddOrUpdate(foo.Bar);打电话之前context.Foos.AddOrUpdate(foo);它会将新的 bar 正确保存到 bar 表中,但不会将正确的 barId 添加到 foo 表中

@尤利亚姆·钱德拉

如果我正确理解你的答案(我认为你在答案中混淆了酒吧和食物),这应该有效吗?

var foo = new Foo();
foo.FooId = 524 //Existing foo;

foo.Bar = new Bar(); //Completely new bar    
db.Foos.AddOrUpdate(foo);
db.SaveChanges();

但事实并非如此


使用断开连接的对象需要额外的代码。

如果您正在使用断开连接的对象,则必须手动管理 同步。

Source http://msdn.microsoft.com/en-us/library/ee373856.aspx

If Bar是一个现有实体,您需要先附加它,所以Foo将被添加为Bar's孩子们。

if (foo.Bar.Id != 0)
{
    context.Bars.Attach(foo.Bar);
    context.Foos.AddOrUpdate(foo);
}

上面代码的例子类似Course (Foo) and Department (Bar) 中的示例本文 http://msdn.microsoft.com/en-us/data/jj713564.aspx.

But if Bar是一个您只需添加的新实体Foo, then Bar也将被添加。

else
{
    context.Foos.Add(foo);
}

其他一些品种可以检查我的答案 https://stackoverflow.com/a/24886346/968303.

update

在进一步解释之前,我想展示相同的代码。

  • db.Set<T>().Add(instance)等于db.Entry(instance).State = EntityState.Added;
  • db.Set<T>().Attach(instance)等于db.Entry(instance).State = EntityState.Unchanged;

前面的答案解释了两个条件。

  • 新 Foo 和现有 Bar

    context.Bars.Attach(foo.Bar);

    context.Foos.AddOrUpdate(foo);

  • 新Foo和新酒吧

    context.Foos.Add(foo);

特别添加

Added有特殊条件,一旦实体被标记为Added。图中的所有实体将被标记为Added即使任何引用实体是数据库中的现有对象也是如此。如果我们有这段代码,Foo 和 Bar 将被添加。

var foo = new Foo (); // new foo
foo.Bar = new Bar { BarId = 123 }; // existing bar
db.Set<Foo>().Add(foo);
db.SaveChanges();

为了防止这种情况发生,需要先附加 Bar。

var foo = new Foo (); // new foo
foo.Bar = new Bar { BarId = 123 }; // existing bar
db.Set<Bar>().Attach(bar);
db.Set<Foo>().Add(foo);
db.SaveChanges();

Check 朱莉·勒曼文章 http://msdn.microsoft.com/en-us/magazine/dn166926.aspx以获得更完整的解释。

发生这种情况的原因是当您使用 DbSet.Add 方法时(即 即Screencasts.Add),不仅标记了根实体的状态 “已添加”,但图中的所有内容都不是上下文 之前意识到的也被标记为已添加。尽管开发商 可能知道Topic有一个现有的Id值,Entity Framework 遵循其 EntityState(已添加)并创建插入数据库命令 对于主题,无论现有的 Id 是什么。

根据您的更新调整说明

您更新的问题是关于现有的 Foo 和新的 Bar。使用您的代码,结果将不会添加新的 Bar,并且现有的 Foo 将不会与新的 Bar 建立关系。

var foo = new Foo();
foo.FooId = 524 //Existing foo;

foo.Bar = new Bar(); //Completely new bar    
db.Foos.AddOrUpdate(foo);
db.SaveChanges();

如果我们手动将 Bar 添加到AddOrUpdate(foo),结果还是没有达到预期。将添加新的 Bar,但 Foo 将与新的 Bar 没有关系。

db.Bars.Add(foo.Bar);
db.Foos.AddOrUpdate(foo);

的行为AddOrUpdate不一致。

Solution

如果您正在使用断开连接的对象,则必须手动管理 同步。

该代码应该在所有条件下都有效。

  • 新Foo和新酒吧
  • 新Foo和现有酒吧
  • 现有的 Foo 和新的 Bar
  • 现有的 Foo 和现有的 Bar

此代码取决于 id(id = 0 是一个新实体)。

db.Entry(foo).State = 
       foo.FooId == 0 ? EntityState.Added : EntityState.Modified;
if (foo.Bar != null)
{
    db.Entry(foo.Bar).State = 
       foo.Bar.BarId == 0 ? EntityState.Added : EntityState.Modified;
                                                             ^^^
    // If you don't want to change the Bar while creating a relationship between
    // Foo and with existing Bar, you can change 
    // `EntityState.Modified` with `EntityState.Unchanged`
}
db.SaveChanges();

相关AddOrUpdate,我认为有一个未解决的问题可以找到here https://entityframework.codeplex.com/workitem/2128.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

保存父实体时,新的子实体将不会保存 的相关文章

  • 尝试了解使用服务打开对话框

    我已经阅读了有关使用 mvvm 模式打开对话框的讨论 我看过几个使用服务的示例 但我不明白所有部分如何组合在一起 我发布这个问题寻求指导 以了解我应该阅读哪些内容 以更好地理解我所缺少的内容 我将在下面发布我所拥有的内容 它确实有效 但从我
  • Grpc - 将消息从一个客户端发送到连接到同一服务器的另一个客户端

    是否可以将消息从一个客户端发送到连接到同一服务器的另一个客户端 我想将数据从一个客户端发送到服务器然后发送到特定客户端 我想我需要获取客户端 ID 但我不知道如何获取此 ID 以及如何从服务器将此消息发送到该客户端 我这里有一个样本 这是一
  • 实体框架中的分页

    在实体框架中 使用 LINQ to Entities 数据库分页通常按以下方式完成 int totalRecords EntityContext Context UserSet Count var list EntityContext Co
  • 传递 constexpr 对象

    我决定给予新的C 14的定义constexpr旋转并充分利用它 我决定编写一个小的编译时字符串解析器 然而 我正在努力保持我的对象constexpr将其传递给函数时 考虑以下代码 include
  • extern 声明和函数定义都在同一文件中

    我只是浏览了一下gcc源文件 在gcc c 我发现了类似的东西 extern int main int char int main int argc char argv 现在我的疑问是extern是告诉编译器特定的函数不在这个文件中 但可以
  • 强制初始化模板类的静态数据成员

    关于模板类的静态数据成员未初始化存在一些问题 不幸的是 这些都没有能够帮助我解决我的具体问题的答案 我有一个模板类 它有一个静态数据成员 必须为特定类型显式实例化 即必须专门化 如果不是这种情况 使用不同的模板函数应该会导致链接器错误 这是
  • 在 C# 中,如何根据在 gridview 行中单击的按钮引用特定产品记录

    我有一个显示产品网格视图的页面 该表内有一列 其中有一个名为 详细信息 的超链接 我想这样做 以便如果用户单击该特定产品的详细信息单元格 将打开一个新页面 提供有关该产品的更多信息 我不确定如何确定哪个Product记录链接的详细信息以及我
  • Eigen 和 OpenMP:由于错误共享和线程开销而没有并行化

    系统规格 Intel Xeon E7 v3 处理器 4 插槽 16 核 插槽 2 线程 核心 Eigen 系列和 C 的使用 以下是代码片段的串行实现 Eigen VectorXd get Row const int j const int
  • C++中判断unicode字符是全角还是半角

    我正在编写一个终端 控制台 应用程序 该应用程序应该包装任意 unicode 文本 终端通常使用等宽 固定宽度 字体 因此要换行文本 只需计算字符数并观察单词是否适合一行并采取相应的操作 问题是 Unicode 表中的全角字符在终端中占用了
  • 已发布的 .Net Core 应用程序警告安装 .Net Core,但它已安装

    我制作了一个 WPF 和控制台应用程序 供某人在我无法访问的私人服务器上使用 我使用 Visual Studio 2019 的内置 发布向导 来创建依赖于框架的单文件应用程序 当该人打开 WPF 应用程序时 他们会看到标准警告 他们单击 是
  • 从 C# 使用 Odbc 调用 Oracle 包函数

    我在 Oracle 包中定义了一个函数 CREATE OR REPLACE PACKAGE BODY TESTUSER TESTPKG as FUNCTION testfunc n IN NUMBER RETURN NUMBER as be
  • 在 C# 中为父窗体中的子窗体控件添加事件处理程序

    我有两种形式 一种是带有按钮和文本框的父表单 单击该按钮时 将打开一个对话框 该子窗体又包含一个文本框和一个按钮 现在我想要的是 每当子表单文本框中的文本更改时 父表单文本框中的文本会自动更改 为了获得这个 我所做的是 Form3 f3 n
  • memcpy/memmove 到联合成员,这是否设置“活动”成员?

    重要说明 一些评论者似乎认为我是从工会抄袭的 仔细看memcpy 它从普通旧地址复制uint32 t 它不包含在联合中 另外 我正在复制 通过memcpy 到工会的特定成员 u a16 or u x in a union 不直接到整个联盟本
  • 如何最好地以编程方式将 `__attribute__ ((unused))` 应用于这些自动生成的对象?

    In my makefile我有以下目标 它将文本 HTML 资源 编译 为unsigned char数组使用xxd i http linuxcommand org man pages xxd1 html 我将结果包装在匿名命名空间和标头保
  • 比较:接口方法、虚方法、抽象方法

    它们各自的优点和缺点是什么 接口方法 虚拟方法 抽象方法 什么时候应该选择什么 做出这一决定时应牢记哪些要点 虚拟和抽象几乎是一样的 虚方法在基类中有一个实现 可以选择重写 而抽象方法则没有 并且must在子类中被覆盖 否则它们是相同的 在
  • EntityFramework 6.0.0.0 读取数据,但不插入

    我创建了一个基于服务的数据库 folderName gt Add New Item gt Data gt Service based Database文件到 WPF 应用程序中 然后我用过Database First方法并创建了Person
  • 没有“对 *this”功能的右值引用的解决方法

    我有一个围绕可移动对象的代理容器类 并希望代理能够隐式生成对底层对象的右值引用 但仅当代理本身被移动时 我相信我将能够按照提案 n2439 实施此行为 将移动语义扩展到 this http www open std org jtc1 sc2
  • 我可以使用 lambda 函数或 std::function 对象来代替函数指针吗?

    我有一个需要使用的库 它定义了以下内容 typedef void CallbackFunction const int i 并且有一个注册回调的函数 如下所示 void registerCallback CallbackFunction p
  • MySqlConnectionStringBuilder - 使用证书连接

    我正在尝试连接到 Google Cloud Sql 这是一个 MySql 解决方案 我能够使用 MySql Workbench 进行连接 我如何使用 C 连接MySqlConnectionStringBuilder 我找不到提供这三个证书的
  • 如何在 C 中将 char 连接到 char* ?

    我怎样才能前置char c to char myChar 我有c值为 A and myChar值为 LL 我怎样才能前置c to myChar使 ALL 这应该有效 include

随机推荐

  • 扩展 CLPlacemark 会导致 EXC BAD ACCESS

    虽然发现了类似的问题here https stackoverflow com questions 20204417 exc bad access after populating nsmutablearray with custom cla
  • 如何使用 SwiftUI 在 NavigationView 中正确包含“添加项目”按钮?

    我需要一个 加号 按钮NavigationView s List navigationBarItems 在导航栏右侧 我想在列表中添加一行 使用导航层次结构中的后续视图输入其名称等 但首先 我什至无法让按钮正确导航 当我在预览画布中点击它时
  • 我们应该如何管理jdk8流的空值

    我知道这个话题可能有点in advance因为 JDK8 尚未发布 至少现在还没有发布 但我正在阅读一些有关 Lambda 表达式的文章 特别是与称为 Stream 的新集合 API 相关的部分 这是中给出的示例Java 杂志文章 http
  • 如何在gradle中下载依赖项

    我有一个自定义编译任务 task compileSpeedTest type JavaCompile classpath files build source fileTree src test java speed destination
  • 安卓相机预览

    我有个问题 我正在尝试开发一个使用相机的程序 一切都在我的设备中运行 但就像你们很多人都知道的那样CameraPreview并非在所有设备上都以相同的方式工作 因此我尝试集成谷歌在此地址中提供的代码 http developer andro
  • 了解 IoC 容器和依赖注入

    我的理解 依赖关系是指 Class 的实例需要 Class 的实例来实例化 ClassA 的新实例 依赖注入是指通过 ClassA 构造函数中的参数或通过 set DependencyNameHere DependencyNameHere
  • 参数化和“不允许函数模板部分专业化”

    这是一个延续constexpr 的函数参数等效项是什么 https stackoverflow com q 39284065在最初的问题中 我们试图加速一些在 Clang 和 VC 下执行移位和旋转的代码 Clang 和 VC 没有很好地优
  • 如果在 UNIX 中的信号处理期间,相同的信号被发送到程序,会发生什么情况?

    对此有什么想法吗 是否存在某种信号队列 或者它是否被丢弃 当我们讨论这个问题时 信号处理程序是否应该做尽可能少的工作 我在某处读到信号处理程序应该使用管道并只向其中写入一个字节 指示程序应该做什么 然后程序在其他地方定期检查管道 并根据其中
  • f:复合组件的参数

    在 JSF2 1 复合组件中 如果我们尝试将 f param 传递给复合组件 命令按钮 并在组件中接收 editableValueHolder 它似乎不起作用 有任何想法吗
  • MessageBox.Show 在应用程序关闭/停用事件中

    我在 Windows Phone 7 8 应用程序的应用程序关闭 停用方法中显示了一个 MessageBox 它用于警告用户活动计时器因应用程序正在关闭而被禁用 应用程序关闭 停用事件非常适合此目的 因为将逻辑放入所有应用程序页面中将是一个
  • 网络可用性 - 背景音乐

    我个人讨厌网站上的背景音乐 我的客户对这个问题有相反的看法 我添加了音乐 因为客户永远是对的 尽管我想与他们一起重新讨论这个主题 几乎每个人都会同意它很烦人并且浪费宝贵的带宽 但是是否有任何可用性研究或对业内受人尊敬的人的建议可以提供反对背
  • 学习/实现设计模式(对于新手)[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • /sbin/ldconfig.real:无法统计 /lib/x86_64-linux-gnu

    当我在 Ubuntu 机器上运行 ldconfig 时 我收到警告 sbin ldconfig real 无法统计 lib x86 64 linux gnu 据我所知 这还没有造成任何问题 但我想 修复 它 以防它稍后回来咬我 有谁知道我为
  • Heroku HIPAA 合规性

    是否可以在 Heroku 上运行符合 HIPAA 要求的应用程序 更具体地说 我需要两个应用程序 一个存储会员信息 另一个存储会员的私人健康信息 我打算使用非对称和对称密钥加密来加密敏感数据 对于将会员与其在其他应用程序上的敏感数据链接起来
  • 如何在 mongoose 中查找包含给定子字符串且带有空格的所有结果

    我找到了很多解决这个问题的方法 但没有一个有效 假设我有以下架构 var Schema new Schema name String url String 假设我的条目之一是 name Product and Services url ww
  • 我无法在 shell 中使用 jq 从 JSON 文件中获取 Key 属性值[重复]

    这个问题在这里已经有答案了 我试图从下面的 JSON 文件中获取密钥 我刚刚执行了下面的命令 它将给出下面的 JSON 输出 Command jq r issues Output expand schema names startAt 0
  • 为什么我的 .storyboards 在 Xcode 11.1 中变成红色?

    刚刚更新到 Mac OS X Catalina 10 15 和 Xcode 11 1 我的一些情节提要变成了红色 所有图形似乎都在那里 但一切都是红色的 非常红 如下所示 他们仍然发布正常 这在我的 MacBook Pro 上的 OS X
  • Character.getNumericValue 的相反是什么

    int x Character getNumericValue A System out println the value of x is x prints 10 我正在寻找一种方法somemethod 10 并返回 A java中是否存
  • 合并msi和exe

    我的部署项目创建 msi 文件和 exe 文件 是否可以将这些合并为一个 exe 是的 您可以创建一个包含 MSI 和 setup exe 引导程序文件的自解压安装程序 我认为可以使用 WinZip 来做到这一点 或者您也可以使用 Wind
  • 保存父实体时,新的子实体将不会保存

    我有一个父实体 foo存在于数据库中 我有一个属性bar在此实体上 一对多关系 Foo已分离 因为它使用 WebApi 进行反序列化 所以我这样做是为了foo context Foos AddOrUpdate foo 就算有新的bar附加到