【问题标题】:Insert Obj into List using c# Linq使用 c# Linq 将 Obj 插入列表
【发布时间】: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 进行排序,而不是创建一个新列。我想在中间插入一个新元素,因为它实际上是一个嵌套列表(由我更新的代码澄清)

标签: c# mysql asp.net linq


【解决方案1】:

当您使用 .ToList() 时,您正在创建一个新实例,因此当您执行 SaveChanges 时,EF 不知道这个新实例,因此它将在您的表中插入一个新项目。

你可以在这里看到一个很好的例子:http://www.entityframeworktutorial.net/update-one-to-many-entities-in-entity-framework.aspx

【讨论】:

  • 我稍微更新了我的代码。所以它实际上是一个对象内的嵌套列表。话虽这么说,除非我错了,否则我认为我不会创建一个新实例。从那里我将在嵌套列表中插入一个值。
猜你喜欢
  • 1970-01-01
  • 2021-04-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-15
  • 1970-01-01
  • 2020-12-10
相关资源
最近更新 更多