我在C#实体框架中有3个类的简单设计:
class Foo{ int id, string name}
class ParentFoo{ int id, Foo foo}
class GrandparentFoo{int id, ParentFoo parentFoo}
当我尝试使用DataContext.SaveChanges()在GrandparentFoo中保存记录时,ParentFoo和Foo的ID会增加,这是意外的。
function AddGrandparent(int g_id, ParentFoo pf){
using (var dc = dcHelper_.CreateDataContext())
{
result = dc.GrandparentFoos.Add(new GrandparentFoo()
{
id = g_id,
parentFoo = pf
});
dc.SaveChanges(); }}
有人可以帮我解决这个问题吗?
答案 0 :(得分:1)
ParentFoo等未与您的上下文关联,因此上下文会将它们视为新实体。避免在加载实体的上下文之外传递实体,以避免出现此类问题。相反,如果将ID所需的父/子数据加载到POCO视图模型中,然后根据需要检索引用,则可以避免未关联实体的问题。
使用您的代码:
void AddGrandparent(int id, ParentFoo pf)
{
using (var dc = dcHelper_.CreateDataContext())
{
var parent = dc.ParentFoos.Find(pf.Id);
dc.GrandparentFoos.Add(new GrandparentFoo
{
Id = id,
ParentFoo = parent
});
dc.SaveChanges();
}
}
如果GrandParentFoo设置了身份,则可以取消设置ID,EF在添加到上下文中时将忽略它。如果parent包含对祖父母的引用,那么您可能还需要在ParentFoo中设置该引用。
var grandParent = dc.GrandparentFoos.Add(new GrandparentFoo
{
Id = id,
ParentFoo = parent
});
parent.GrandparentFoo = grandParent;
编辑: 如果GrandParent有一个Parent集合,而您想创建一个Grandparent并将其与一个现有的Parent相关联:
首先,请确保将GrandParent中的Parents集合初始化为新的List / HashSet
public virtual ICollection<ParentFoo> ParentFoos {get; set;} = new List<Parent>();
然后
using (var dc = dcHelper_.CreateDataContext())
{
var parent = dc.ParentFoos.Find(pf.Id);
var grandParent = dc.GrandparentFoos.Add(new GrandparentFoo
{
Id = id
});
grandParent.ParentFoos.Add(parent);
parent.GrandparentFoo = grandParent;
}
ParentFoo的子级与父级无关,并且关联的子级已经存在于数据中。