【发布时间】:2016-07-27 09:58:29
【问题描述】:
我正在尝试将一个对象插入到列表中。
childModel childElement= new childModel;
parentModel myList = db.list.Where(e => e.id.equals(someId)).Include("someNestedList").FirstOrDefault();
childElement.prop1 = true;
myList.someNestedList.Insert(index, childElement);
所以我注意到从这里开始一切正常,因为它将子对象插入到列表中的适当索引处。当我尝试保存此列表时出现问题。
db.Entry(myList).State = EntityState.Modified;
db.SaveChanges();
我注意到它没有将索引保存在数据库中,而是添加了另一个条目。下一个可用的 id。所以我要说的是,一旦我插入值,它就不会重新排列主键。
不使用 insert 方法,只对每个子元素使用 db.Entry() = EntityState.Modified 会更好吗?
有什么建议吗?
【问题讨论】:
-
EF 使用 id(主键)来了解您要更新的行。所以,这并不像你想象的那么简单。基本上,您需要使用新值更新该索引处的项目,并使用前一个更新所有以下项目,并使用最后一个值创建一个新项目(假设您的列表按 id 排序,我们正在谈论一个身份)。尽管您可能想重新考虑您的设计,因此您一开始就不需要这样做。
-
是的,这将是我的第二个建议,您必须再次修改每个元素。当您说设计时,您是在谈论不使用 id/主键作为排序值吗?
-
我的意思是为什么你需要通过你的主键ID在“中间”插入一个新元素?如果您需要维护一个订单,那么也许可以为此使用一个单独的列,但是您必须再次进行大量更新才能更改订单。
-
嗯,我使用我的主键 id 进行排序,而不是创建一个新列。我想在中间插入一个新元素,因为它实际上是一个嵌套列表(由我更新的代码澄清)