Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 实体框架4.1修改对象和子集合_C#_.net_Linq_Entity Framework_Entity Framework 4 - Fatal编程技术网

C# 实体框架4.1修改对象和子集合

C# 实体框架4.1修改对象和子集合,c#,.net,linq,entity-framework,entity-framework-4,C#,.net,Linq,Entity Framework,Entity Framework 4,如果我有一个Book对象,它有一个注释的子集合,那么我可以将Book和注释列表与实体框架一起更新吗 我试过: _context.Books.Attach(book); _context.ObjectStateManager.ChangeObjectState(book, EntityState.Modified); _context.SaveChanges(); 没有运气 在第一行中获取以下错误: ObjectStateManager中已存在具有相同键的对象。ObjectStateManage

如果我有一个Book对象,它有一个注释的子集合,那么我可以将Book和注释列表与实体框架一起更新吗

我试过:

_context.Books.Attach(book);
_context.ObjectStateManager.ChangeObjectState(book, EntityState.Modified);
_context.SaveChanges();
没有运气

在第一行中获取以下错误:


ObjectStateManager中已存在具有相同键的对象。ObjectStateManager无法跟踪具有相同键的多个对象,这很可能是因为您具有循环依赖关系(Books具有对注释的外键引用,注释返回到Books)。在这种情况下,EF中的UpdateTranslator无法确定依赖顺序。据我所知,在这个开发模型中,没有办法向EF传递提示来指示顺序是什么

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

编辑:
下面是一个例子:

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

来执行上述操作。“没有运气”不是很好的描述。当您尝试它时,会发生什么情况?我得到一个错误:“ObjectStateManager中已经存在一个具有相同键的对象。”。ObjectStateManager无法跟踪具有相同键的多个对象“在哪一行?”?
Attach
行?在尝试
Attach
之前,您是否
deattch
了这本书?i、 你能在这之前显示代码吗…我没有先尝试分离这本书…这是我现在方法中仅有的三行..将book对象作为参数传入。我是EF新手,你可以告诉我…如果我上面发布的代码试图在一个调用中完成所有操作,我如何修改它以将其分成两部分?我不确定我是否真的有循环依赖关系…我的注释对象有BookID属性,my Book对象有一个Comments导航属性…DB中肯定没有循环依赖项。您是否尝试过执行两个单独的
SaveChanges
以查看这是否解决了问题?如果没有更好的模型视图,就很难进一步调试。