如何使用嵌套对象的DBContext.Add / Attach(使用EF Code First 4.1)

时间:2012-09-10 14:17:24

标签: entity-framework code-first dbcontext

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

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

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

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

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

有没有人知道在新版本的EF CodeFirst中这是不同的?

1 个答案:

答案 0 :(得分:5)

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

您必须在图表中找出每个实体的正确状态,例如使用:

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

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