我正在插入或更新具有关联子实体的父实体。实体框架插入或更新实体但它永远不会创建或更新它们之间的链接,即使它们存在于C#中。
public void MergeParent(Parent parent)
{
// Set Parent
var parentInDB = context.Parents.SingleOrDefault(p => p.ParentID == parent.ParentID);
if (parentInDB != null)
{
parent.ID = parentInDB.ID;
context.Entry(parentInDB).CurrentValues.SetValues(parent);
}
else
{
context.parents.Add(parent);
}
// Set child
foreach(var child in parent.children)
{
var childInDB = context.children.SingleOrDefault(a => a.DiscogsID == child.DiscogsID && child.DiscogsID != null);
if (childInDB != null)
{
child.ID = childInDB.ID;
context.Entry(childInDB).CurrentValues.SetValues(child);
}
else
{
context.children.Add(child);
}
}
// Finally Save
context.SaveChanges();
}
如果我设置了一个断点,我可以看到父节点已关联子节点,但是当数据库包含元素时,它不会更新链接表。
答案 0 :(得分:1)
// Set child foreach(var child in parent.children) { var childInDB = context.children.SingleOrDefault(a => a.DiscogsID == child.DiscogsID && child.DiscogsID != null); if (childInDB != null) { child.ID = childInDB.ID; context.Entry(childInDB).CurrentValues.SetValues(child); } else { context.children.Add(child); } }
问题在上面的部分中,对于孩子们,您要从数据库中添加和检索,而不是从parentInDb
的子集合中添加和检索。我不认为SetValues
会更新关系。
我修改了一些代码并添加了一些注释:
// Add an include to bring in the children
var parentInDB = context.Parents.Include(p => p.children)
.SingleOrDefault(p => p.ParentID == parent.ParentID);
if (parentInDB != null)
{
// This line shouldn't be necessary...
// parent.ID = parentInDB.ID;
context.Entry(parentInDB).CurrentValues.SetValues(parent);
// Set child
foreach(var child in parent.children)
{
// Should search in parentInDB, not context
// If DiscogsID is a primary key, it can't be null
var childInDB = parentInDB.children.SingleOrDefault(a => a.DiscogsID == child.DiscogsID);
if (childInDB != null)
{
// This line shouldn't be necessary...
// child.ID = childInDB.ID;
context.Entry(childInDB).CurrentValues.SetValues(child);
}
else
{
// Should add to parentInDB, not context
parentInDB.children.Add(child);
}
}
// Would children in parentInDB.children not found in parent.children need to be removed?
}
else
{
// This will automatically add untracked children
context.parents.Add(parent);
}
// Finally Save
context.SaveChanges();
如果您在parent
添加新children
之前附加的实体,我就不知道会发生什么。