问题:将对象“Order”添加到我的 dbcontext 时,该订单的所有嵌套对象都会“读取”到数据库中,尽管嵌套对象是静态数据,并且只应在数据库中添加引用。
例子:
数据库包含 0 个订单和 3 个项目。
我添加了一份包含 2 件商品的订单。
现在数据库有1个订单,5个商品。订单中的两个项目已被“读取”到数据库中,即使这些项目在 db.SaveChanges() 之前具有正确的主键。
我意识到我可以在保存更改之前将现有项目附加到 dbcontext,但这真的是唯一的方法吗?当主键与现有项目匹配时,EF 无法判断出该项目已经存在吗?
有谁知道新版本的 EF Code First 是否有所不同?
No EF 无法确定实体是现有实体还是新实体 https://stackoverflow.com/questions/3635071/update-relationships-when-saving-changes-of-ef4-poco-objects/3635326#3635326- 添加和附加命令都是面向图形的操作。您在图中的一个实体上调用它们,它们会遍历所有关系(及其关系等)并为它们执行操作。
您必须计算图中每个实体的正确状态,例如使用:
dbContext.Orders.Add(newOrder);
foreach(var item in newOrder.Items) {
dbContext.Entry(item).State = EntityState.Unchanged;
}
dbContext.SaveChanges();
您可以通过调用来使用相反的操作Attach(newOrder)
并将顺序设置为Added
状态。主要区别在于独立协会 https://stackoverflow.com/questions/5281974/code-first-independent-associations-vs-foreign-key-associations/5282275#5282275(例如多对多关系)。第一种方法将正确添加订单和每个项目之间的新关系,而第二种方法则不会,除非您手动将每个关系设置为Added
状态(并且改变关系的状态更加复杂)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)