2011-04-28 53 views
2

如果我有Book对象具有子集合的评论,我可以用实体框架更新书籍和评论列表吗?实体框架4.1修改对象和子集合

我曾尝试:

_context.Books.Attach(book); 
_context.ObjectStateManager.ChangeObjectState(book, EntityState.Modified); 
_context.SaveChanges(); 

,没有运气...

得到第一线以下错误:

An object with the same key already exists in the ObjectStateManager. The ObjectStateManager cannot track multiple objects with the same key

+0

“没有运气”不是很具描述性。当你尝试时,究竟会发生什么? – 2011-04-28 17:04:28

+0

我收到错误:'ObjectStateManager中已存在具有相同键的对象。 ObjectStateManager无法使用同一个键“ – stephen776 2011-04-28 17:12:47

+0

”跟踪多个对象在哪条线上? “附加”行? – 2011-04-28 17:17:25

回答

2

更可能的是你有一个圆形依赖关系(书籍具有对评论的外键引用,以及对图书的评论)。在这种情况下,EF内的UpdateTranslator无法确定依赖性顺序。据我所知,在这种发展模式中,没有办法将提示传递给EF来指示订单的内容。

解决这个问题的最常见方法(我见过)是做两阶段提交。对书进行更改,保存,然后对评论进行更改并保存。我发现使用Code First方法可以让你更具体地了解关系,从而解决我遇到的许多问题。

编辑:
下面是一个例子:

using (var context = new BookContext()) 
{ 
    book.Title = "This is the new title"; 
    context.SaveChanges(); 

    book.Comments.Add(new Comment("This is a comment")); 
    context.SaveChanges(); 
} 

如果有一个循环依赖,你不能做到以上至SaveChanges一个电话。

+0

如果我上面发布的代码试图在一次调用中做所有事情,我该如何修改它以将它分成2个部分? – stephen776 2011-04-28 17:46:23

+0

我不确定我实际上是否有循环依赖......我的评论对象有一个BookID属性,而我的书籍对象有一个评论导航属性...... DB本身内部肯定没有循环依赖关系 – stephen776 2011-04-29 11:25:05

+0

你试过了吗两个单独的'SaveChanges'来看看是否能解决这个问题?如果没有更好的模型视图,将很难进一步调试。 – 2011-04-29 13:17:21