将单个对象添加到DbContext会隐式生成无限的新对象

时间:2016-09-11 01:43:15

标签: c# .net entity-framework

我有一个巨大的EF模型。在某些步骤中,我将多个不同的对象添加到上下文中,并像这样调用SaveChanges():

ctx.DbSet1.Add(obj1);
ctx.DbSet2.Add(obj2); // magic line
ctx.DbSet3.Add(obj3);
....
ctx.DbSet100.Add(obj100);
ctx.SaveChanges();

我注意到有时此代码会抛出异常消息:

  

无法确定相关操作的有效排序。   由于外键约束,模型可能存在依赖关系   要求或商店生成的值。

因为有很多物体,所以我必须找到产生错误的确切线。所以我最终得到了这段代码:

ctx.DbSet1.Add(obj1);
ctx.SaveChanges(); // works well
ctx.DbSet2.Add(obj2); // magic line
ctx.SaveChanges(); // getting error here
ctx.DbSet3.Add(obj3);

我发现SaveChanged在对象#2 simetimes 产生此错误后正好执行。我以相同的方式多次运行应用程序,有时运行良好,有时魔术线将数百个实体添加到状态=已添加的上下文中。对象2不是自引用的,但是通过Context模式是,有一个循环引用可能有十个表 我不是要求解决这个问题,但是,在添加一个对象之后,上下文的原因是什么可能创建了许多对象? 谢谢!

1 个答案:

答案 0 :(得分:0)

问题是对象#2没有被创建为新的,而是被声明为 static (通过我们系统中的业务逻辑,我们有许多预定义的对象)。所以#2一劳永逸地保留了它的属性和相关的父母和集合(所有那些对象#1,#3,...,#100)。在每次往返中,将对象#2视为一个全新的对象,我们给它的外键新值,这影响了所有相关实体,这似乎产生了创造了大量实体的竞赛。答案很简单,但花了几个小时......希望它能帮助别人。