实体框架 - 添加子实体

时间:2012-10-30 22:36:54

标签: entity-framework parent-child

实体框架5.0代码首先使用现有数据库。使用电动工具反向设计类。一切都很好。数据库有两个表。一个父项和一个子项,外键返回父ID。 ID都是自动增量的int。我已添加了许多父记录,现在想要将子记录添加到特定父级。我可以看到这样做的唯一方法是通过在Parents表中搜索名称或其他属性来查找相应的父ID,并返回ID。然后在添加子项时在外键属性中使用该ID。我不想创建一个新的父母,所以这是将孩子添加到现有父母的唯一方法吗?所有的互联网示例似乎都添加了一个孩子,同时添加了一个新的父级,而不是将子级添加到现有的父级。任何帮助将不胜感激

1 个答案:

答案 0 :(得分:23)

在谈到EF时,“Julie”(Lerman)恰好是我们的老师之一。正如她在她的书 DbContext 中解释的那样,父子关联中可以涉及三个属性,两个导航属性(parent.Children,child.Parent)和一个外键属性(child.ParentId)。您可以在代码中设置其中一个或它们的任意组合。

当触发EF以检测更改时(例如,在调用SaveChanges时),它会启动一个名为 relationship fixup 的过程,以确保这三个属性保持同步。

因此,您有三个选项可以将子实体添加到父级:

  1. child.Parent = parentObject。应首先从数据库中提取父对象。
  2. parentObject.Children.Add(child)。还需要数据库中预先存在的父对象。
  3. child.ParentId = parentId,您只需要知道ID。您可以按照建议的方式获取Id,但同样,对于您知道不会被删除的对象,您可以将其保存在某个变量中,以便在事务中重复使用。
  4. 使用前两个选项,不需要手动将子对象添加到上下文中。 EF足够了解它是新的。使用第三个选项时,必须在context.Children之前将其添加到SaveChanges