我有一个工作对象:
public class Work{
public int WorkId { get; set; }
public virtual Work RelatedWork { get; set; }
public virtual ICollection<Work> RelatedMultipleWorks { get; set; }
}
我正在生成一个像这样的Work对象:
Work myWork = new Work();
work mywork2 = new Work();
work mywork3 = new Work();
myWork.RelatedMultipleWorks.add(mywork2);
myWork.RelatedMultipleWorks.add(mywork3);
在DbSaveChanges
上,我遇到了这个例外:
实体对象不能被多个实例引用 IEntityChangeTracker。
代码有什么问题?我怎样才能解决这个问题?感谢。
我在这一行得到了例外:
_db.Works.Add(mywork);
这是我的DbSaveChanges系列:
_db.Works.Add(_myWork);
_db.SaveChanges();
result.Success= true;
_provider.AddOrUpdate(mywork);
注意:在实际代码中,Work实体有更多实体。像数百,所以我不能发布实际的代码。
编辑:
当我尝试使用_db.Works.Add(_myWork2);
添加myWork2或myWork3时,我仍然会收到相同的错误。这个错误是因为缺少实体还是类似的东西?
答案 0 :(得分:3)
最终,这与此处提到的问题相同:How can I use EF to add multiple child entities to an object when the child has an identity key?
如果您有一个自动生成的PK并尝试在同一个上下文中执行上一个udpate / delete之后执行Add,它将会崩溃,因为您最终会同时为多个对象提供相同的PK。要解决这个问题,你必须将所有那些WorkIds(我认为这是PK)设置为-1,-2,-3以及它们对这些新数字的正确FK引用,或者在进行任何更新之前必须先添加所有新实体/删除,因为EF将意识到将来会设置这些ID。希望这有帮助!
答案 1 :(得分:0)
在ID属性
上为您的对象添加标签PATH
答案 2 :(得分:0)
这里存在问题:
Work myWork = new Work();
work mywork2 = new Work();
work mywork3 = new Work();
您正在每个类的公共构造函数中创建数据上下文,因为这必须是构建工作类的内容,然后您尝试添加它并使用实例化的多个上下文为集合中的每个对象构建多个关系。相同的实体对象。这是投诉。修复是创建一个新的构造函数,它接受在类之外创建的上下文,并将其用作实例化每个类的参数。他们应该是这样的:
work myWork = new Work(mySingleContext);
work myWork2 = new Work(mySingleContext);
work myWork3 = new Work(mySingleContext);
这应满足要求,但请注意,如果您对其他项目执行相同操作并将上下文添加到从同一实体项目实例化的另一项目,您仍会出错。但是,现在当您调用.Add()方法时,项目将共享同一个Entity实例,并且不应该引发错误。
答案 3 :(得分:-1)
也许你可以试试:
myWork.RelatedMultipleWorks.addRange(new List<Work>{ mywork1, mywork2 });
第二次尝试这个:
如果从virtual
对象的RelatedMultipleWorks
成员中删除Work
关键字,会发生什么情况?
第三次运行:
WorkId是主键吗?也许它需要一个价值?
似乎还需要首先将子对象添加到数据库中 - 主键是对现有对象的引用。