2012-10-30 41 views
8

实体框架5.0先使用现有数据库编码。使用电动工具对课程进行逆向设计。一切都很好。数据库有两个表。一个父母和一个带外键的孩子回到父母身份。 ID都是自动增量的int。我添加了一些父记录,现在想要将子记录添加到特定的父母。我能看到的唯一方法是通过在Parents表中搜索名称或其他属性并返回ID来找到适当的父ID。然后在添加子项时在外键属性中使用该ID。我不想创造一个新的父母,所以这是将孩子添加到现有父母的唯一方法吗?所有的互联网示例似乎添加一个孩子,并添加一个新的父母,而不是添加一个孩子到现有的父母。任何帮助将不胜感激实体框架 - 添加子实体

+0

要设置相关实体​​,您可以将导航属性设置为父实体或设置外键。如果你知道这个ID,并且你没有父节点就是外键。如果您有父对象只需设置导航属性。如果你不知道该ID,也没有父对象,你怎么知道该子实体与哪个父母相关? – Pawel

+0

让我试一试。假设父实体是老师,我在db中有Bob,Julie和Dave。儿童实体是一个教师与多个班级关系的班级。我想向朱莉添加一个班级,但我没有她的主要ID,因为它是几天前我进入她时自动创建的。那么,我是否必须搜索教师姓名属性中的“Julie”并返回她的主ID,然后将其用作新类别外键? – user1626137

+0

识别Julie的唯一方法是使用ID。原因是ID始终是唯一的,为什么名称不是。您可以使用像context.Teachers.First(t => t.Name ==“Julie”)这样的代码从数据库中引入实体并使用该ID或引用。没有其他的方式来建立关系,因为你不知道如何设置关系。另外请注意,Julie可能在此期间被删除。 – Pawel

回答

22

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

当EF被触发以检测更改(例如,当被调用SaveChanges)它启动一个称为关系修正,其确保三个属性将在同步过程。

所以,你有三种选择,以子实体添加到父:

  1. child.Parent = parentObject。父对象应该首先从数据库中获取。
  2. parentObject.Children.Add(child)。还需要来自数据库的预先存在的父对象。
  3. child.ParentId = parentId,对此您只需要知道id。您可以按照您的建议获取Id,但同样如此,对于您知道的对象不会被删除,您可以将其保存在某个变量中以在事务中重复使用它。

使用前两个选项,子对象不需要手动添加到上下文中。 EF足够了解这是新的。有了第三个选项,它必须在SaveChanges之前添加到context.Children

+0

我已经将此标记为答案,并且还指出了Pawel的评论,两者都证实了我的假设,即我需要父实体或至少是父代ID,然后才能添加子代。附:我拥有Julie的所有书籍和例子,它们在学习Entity Framework的过程中提供了巨大的帮助。 – user1626137