gpt4 book ai didi

entity-framework - 如何将 DBContext.Add/Attach(使用 EF Code First 4.1)与嵌套对象一起使用

转载 作者:行者123 更新时间:2023-12-05 01:21:46 25 4
gpt4 key购买 nike

问题:将对象“订单”添加到我的 dbcontext 时,订单的所有嵌套对象都被“重新添加”到数据库中,尽管嵌套对象是静态数据并且只应在数据库中添加引用。

例子:
数据库包含 0 个订单和 3 个项目。

我添加了一个包含 2 个项目的订单。

现在数据库有 1 个订单和 5 个项目。订单中的两个项目已“重新添加”到数据库中,即使这些项目在 db.SaveChanges() 之前具有正确的主键。

我意识到我可以在保存更改之前将现有项目附加到 dbcontext,但这真的是唯一的方法吗?当主键与现有项目匹配时,EF 无法确定 to 项目已存在吗?

有谁知道这在新版本的 EF CodeFirst 中是否有所不同?

最佳答案

EF cannot figure if entities are existing one or new one - 添加和附加命令都是面向图形的操作。你在图中的一个实体上调用它们,它们遍历所有关系(及其关系等)并为它们执行操作。

例如,您必须使用以下方法计算图中每个实体的正确状态:

dbContext.Orders.Add(newOrder);
foreach(var item in newOrder.Items) {
dbContext.Entry(item).State = EntityState.Unchanged;
}
dbContext.SaveChanges();

您可以通过调用 Attach(newOrder) 来使用相反的操作。并将订单设置为 Added状态。主要区别在于 independent associations (例如多对多关系)。第一种方法将正确添加订单和每个项目之间的新关系,而第二种方法不会,除非您手动将每个关系设置为 Added状态(改变关系的状态更复杂)。

关于entity-framework - 如何将 DBContext.Add/Attach(使用 EF Code First 4.1)与嵌套对象一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12353592/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com