Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Entity framework 如何将DBContext.Add/Attach(使用EF CodeFirst 4.1)与嵌套对象一起使用_Entity Framework_Code First_Dbcontext - Fatal编程技术网

Entity framework 如何将DBContext.Add/Attach(使用EF CodeFirst 4.1)与嵌套对象一起使用

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项已存在吗

问题:将对象“Order”添加到我的dbcontext时,该顺序的所有嵌套对象都会“readed”到数据库中,尽管嵌套对象是静态数据,只应在数据库中添加引用

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

我添加了一个订单和两个项目

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

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

有人知道新版本的EF CodeFirst是否与此不同吗?

否-添加和附加命令都是面向图形的操作。在图中的一个实体上调用它们,它们遍历所有关系(以及它们的关系等等),并对它们执行操作

必须在图中绘制每个实体的正确状态,例如,使用:

dbContext.Orders.Add(newOrder);
foreach(var item in newOrder.Items) {
    dbContext.Entry(item).State = EntityState.Unchanged;
}
dbContext.SaveChanges();
您可以通过调用
Attach(newOrder)
使用反向操作,并将订单设置为
Added
状态。主要的区别将随之而来(例如多对多关系)。第一种方法将正确地在订单和每个项目之间添加新关系,而第二种方法则不会,除非您手动将每个关系设置为
Added
状态(并且更改关系的状态更为复杂)