Entity framework 如何将DBContext.Add/Attach(使用EF CodeFirst 4.1)与嵌套对象一起使用
问题:将对象“Order”添加到我的dbcontext时,该顺序的所有嵌套对象都会“readed”到数据库中,尽管嵌套对象是静态数据,只应在数据库中添加引用 例如: 数据库包含0个订单和3个项目 我添加了一个订单和两个项目 现在数据库保存1个订单和5个项目。顺序中的两个项已“读取”到数据库,即使这些项在db.SaveChanges()之前具有正确的主键 我意识到,在保存更改之前,我可能能够将现有项附加到dbcontext,但这真的是唯一的方法吗?当主键与现有项匹配时,EF无法确定to项已存在吗 有人知道新版本的EF CodeFirst是否与此不同吗?否-添加和附加命令都是面向图形的操作。在图中的一个实体上调用它们,它们遍历所有关系(以及它们的关系等等),并对它们执行操作 必须在图中绘制每个实体的正确状态,例如,使用:Entity framework 如何将DBContext.Add/Attach(使用EF CodeFirst 4.1)与嵌套对象一起使用,entity-framework,code-first,dbcontext,Entity Framework,Code First,Dbcontext,问题:将对象“Order”添加到我的dbcontext时,该顺序的所有嵌套对象都会“readed”到数据库中,尽管嵌套对象是静态数据,只应在数据库中添加引用 例如: 数据库包含0个订单和3个项目 我添加了一个订单和两个项目 现在数据库保存1个订单和5个项目。顺序中的两个项已“读取”到数据库,即使这些项在db.SaveChanges()之前具有正确的主键 我意识到,在保存更改之前,我可能能够将现有项附加到dbcontext,但这真的是唯一的方法吗?当主键与现有项匹配时,EF无法确定to项已存在吗
dbContext.Orders.Add(newOrder);
foreach(var item in newOrder.Items) {
dbContext.Entry(item).State = EntityState.Unchanged;
}
dbContext.SaveChanges();
您可以通过调用Attach(newOrder)
使用反向操作,并将订单设置为Added
状态。主要的区别将随之而来(例如多对多关系)。第一种方法将正确地在订单和每个项目之间添加新关系,而第二种方法则不会,除非您手动将每个关系设置为Added
状态(并且更改关系的状态更为复杂)