【问题标题】:EF - An object with the same key already exists in the ObjectStateManager when adding existing entity to AssociationEF - 将现有实体添加到关联时,ObjectStateManager 中已存在具有相同键的对象
【发布时间】:2013-03-16 08:53:13
【问题描述】:

所以我早些时候发布了一个问题,但没有收到太多反馈。可能是我解释错了。当您的知识有限时,很难提出正确的问题。

总而言之,我有三个 EF 实体:Books、Pages 和 Content - 这本书有很多页,而一个页面只有一个内容。

我已经有内容条目,我不需要创建它们,只需在我的 Page 实体中引用它们即可。所以我想做的是:

//Add a new Book
var myBook = new Book();
//Add a new page
var myPage = new Page();

//I'm selecting this one from an asp.net dropdown box
var myContent = contentService.get(id); 

//Connect the page and content
myPage.Content = myContent;

//Add a page to the book
myBook.Pages.Add(myPage)

当我添加第一页时,一切都很好,但是当我尝试在我的书中添加第二页时,我得到了一个例外。如果我注释掉我将 myContent 分配给导航属性 (myPage.Content = myContent) 的行,错误就消失了。

最大的问题是......当页面引用已经存在的数据库条目时,如何添加具有 2 个或更多页面(数据库中的 2 个新条目)的新书?

【问题讨论】:

  • 您是否尝试在同一进程中添加第二页?或者您的页面我已经存在于数据库中,您尝试添加第二个页面?
  • 此时没有任何内容保存在数据库中。数据库仅包含内容条目。我想要做的是创建一本新书,然后是一个新页面(数据库中已有内容),另一个,另一个......一旦我完成了,我想保存一个新的book(一个数据库条目)及其所有页面(包含 FK 内容的多个数据库条目)
  • 在您的“页面”关系中,2 个页面可以引用相同的内容吗?这就是这里的问题(除非每次调用都将“Id”更改为其他内容)。
  • 如果两个页面有相同的内容就很好了。这对 EF 来说是个问题吗?
  • 在失败的实体上,您的 ID 字段上的 DB 生成选项是否正确。检查那把钥匙。如果它没有在 EF 中标记为 Exteranlly genrated,则值为 0 的 id 将执行此操作。

标签: c# asp.net entity-framework webforms


【解决方案1】:

交换两行:

myBook.Pages.Add(myPage);
myPage.Content = myContent;

原因是myBook.Pages.Add(myPage) 将myPage 中的整个对象图的状态更改为Added。所以如果先添加页面再分配内容,内容依然是Unchanged。

【讨论】:

  • 我已经尝试了很多东西,这就是其中之一,但现在我不记得我是否遇到了同样的错误。我会试试这个然后回复你。关于重新发布的评论 - 你是对的,我要删除我的第一个问题
猜你喜欢
  • 1970-01-01
  • 2014-05-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多