won*_*id2 4 entity-framework code-first dbcontext
问题:向我的dbcontext添加对象"Order"时,订单的所有嵌套对象都会"读取"到数据库,尽管嵌套对象是静态数据,并且只在数据库中添加了一个引用.
示例:数据库包含0个订单和3个项目.
我添加了一个包含2个项目的订单.
现在数据库包含1个订单和5个项目.订单中的两个项目已经"读取"到数据库中,即使这些项在db.SaveChanges()之前具有正确的主键.
我意识到我可以在保存更改之前将现有项附加到dbcontext,但这真的是唯一的方法吗?当主键与现有项匹配时,EF不能确定项已存在吗?
有没有人知道在新版本的EF CodeFirst中这是不同的?
没有EF无法确定实体是现有实体还是新实体 - 添加和附加命令都是面向图形的操作.您可以在图形中的一个实体上调用它们,它们遍历所有关系(及其关系等)并为它们执行操作.
您必须在图中找出每个实体的正确状态,例如使用:
dbContext.Orders.Add(newOrder);
foreach(var item in newOrder.Items) {
dbContext.Entry(item).State = EntityState.Unchanged;
}
dbContext.SaveChanges();
Run Code Online (Sandbox Code Playgroud)
您可以通过调用Attach(newOrder)并将订单设置为Added州来使用反向操作.主要区别在于独立关联(例如多对多关系).第一种方法将正确地添加订单和每个项目之间的新关系,而第二种方法将不会,除非您手动将每个关系设置为Added状态(并且关系的更改状态更复杂).
| 归档时间: |
|
| 查看次数: |
5366 次 |
| 最近记录: |