实体框架不保存子链接

时间:2015-05-28 18:53:57

标签: entity-framework

我正在插入或更新具有关联子实体的父实体。实体框架插入或更新实体但它永远不会创建或更新它们之间的链接,即使它们存在于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();
}

如果我设置了一个断点,我可以看到父节点已关联子节点,但是当数据库包含元素时,它不会更新链接表。

1 个答案:

答案 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之前附加的实体,我就不知道会发生什么。