4

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

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

我添加了一份包含 2 件商品的订单。

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

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

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

4

1 回答 1

5

没有EF 无法确定实体是现有实体还是新实体- Add 和 Attach 命令都是面向图形的操作。您在图中的一个实体上调用它们,它们会遍历所有关系(及其关系等)并为它们执行操作。

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

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

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

于 2012-09-10T20:24:15.307 回答