实体框架在更新父级时更新子级

时间:2011-11-10 21:12:46

标签: entity-framework entity-framework-4.1

我发送父母及其子女都要更新到我的服务层。

模型设置如下:

public class Parent
{
    public int ParentId { get; set; }
    public ICollection<Child> Children;
}

public class Child
{
    public int ChildID {get; set;}
    public virtual Parent Parent{get;set}
    public virtual int ParentId{get; set;}
    public string FirstName { get; set; }
}

我喜欢的行为是,子节点始终附加到父节点,因此如果子节点在未找到附加的数据库中,我们应该删除它。如果它不存在,请创建它。如果存在,请更新它。

如何在不编写代码的情况下手动完成所有这些调用?就像删除所有,然后重新添加所有。

1 个答案:

答案 0 :(得分:2)

您不需要删除所有子项并重新添加它们(如果您在数据库中有其他实体引用您只想更新的子项,则无论如何都可能是一个问题。删除并重新添加 - 添加它会导致外键约束违规)。

你实际需要做的事情更复杂:(

您必须在数据库中加载原始对象图,然后逐个检查子项是否已删除,如果是新的或已存在。

完全适合您的模型的示例如下:

The relationship could not be changed because one or more of the foreign-key properties is non-nullable

实体框架不支持您使用分离的对象图更新数据库中的对象图。它提供的唯一支持是更新标量和复杂属性。对于那些,您可以使用ApplyCurrentChanges(适用于ObjectContext)或Entry(entity).CurrentValues.SetValues(适用于DbContext)。后者在链接示例中用于更新父级和每个子级的标量属性。但更新实体之间的关系是一项手动任务。