【问题标题】:How to save collection into entity properly?如何正确地将集合保存到实体中?
【发布时间】:2011-03-23 02:00:33
【问题描述】:

我有一些里面有 EntityCollection 的对象。 如果我只是添加新实体,一切都会很好。这里的代码:

Context.ApplyChanges()
Context.SaveChanges()

但如果我尝试更新实体,我会收到以下消息:

AcceptChanges 无法继续,因为 对象的键值与 中的另一个对象 对象状态管理器。确保 键值在调用之前是唯一的 接受更改。

即使使用相同的集合对象。我的意思是集合中不可能有真正相同的实体对象,因为如果它们是新的,它们就会保存到数据库中。但!如果我尝试将相同的代码应用到单独的实体到集合中,它们会被保存,但如果我尝试将它应用到对象(容器)上,则会出现此错误。

感谢您的帮助

【问题讨论】:

  • 修改您的问题并提供一些代码,显示您在发生错误时所做的操作。说明您是如何检索实体的。

标签: .net entity-framework self-tracking-entities


【解决方案1】:

您是否尝试过从Context 检索您希望更改的实体,适当地修改该实体,然后保存更改?如果是这样,你能提供一个更详细的例子吗?

【讨论】:

  • 是的,我这样做了。首先我只是将实体保存到数据库中,然后我得到它,更改(将对象添加到集合中)并尝试再次保存,这次我失败了。
  • @Seacat “将对象添加到集合中”是什么意思?这看起来很明显,但实际上,你在用这个对象做什么?
  • 我有带有集合的对象,它是 TrackableCollection,我只是添加新实体并保存容器对象 - 一切都保存了。但是,如果我随后将新对象添加到集合中并尝试保存,则会失败。
  • @Seacat 能否再给我们看一些代码,显示有效的部分和无效的部分?
【解决方案2】:

我怀疑您在模型或表架构中遗漏了某些内容。如果预计模型主键是自动生成的,这就是我所期望的,但是您的表/模型代码没有以这种方式定义它。然后,您会将集合中对象的所有主键设置为零,并且在尝试插入第二个对象时会出现主键冲突。

【讨论】:

  • 不幸的是,密钥不是自动生成的。但是,如果这是为什么我可以将 2 个新实体添加到一个新对象并保存对象的问题,并且所有内容都已保存,但如果我已经拥有该对象以及集合中的一个实体,那么如果我只是尝试添加第二个(和第一种情况一样)我失败了?
  • @Seacat - 这只是根据您所描述的猜测。我将您所说的解释为,如果您仅添加它可以工作的实体,但如果您添加了具有关联对象的实体,则它没有。这让我认为关联对象中的键可能有问题。我之前在表中的 PK 未设置为 IDENTITY 列时看到过类似的错误,因为 int 的默认值为 0(因此它始终为非空)。
  • 谢谢,我会尝试检查表中的键,然后告诉结果。
  • 我已经解决了这个问题。事实证明,我必须设置仅定义 id 的嵌套引用实体,而不是对象本身。我忘了更新(应用更改)新添加的实体。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多