Entity Framework - 添加子实体

10

使用现有数据库的 Entity Framework 5.0 Code First。使用 Power Tools 反向工程了类。一切都运作良好。数据库有两个表,一个父表和一个包含外键返回到父表 ID 的子表。所有 ID 均为 int 类型,具备自动递增功能。我已经添加了很多父记录,现在想要将子记录添加到特定的父记录中。我唯一能想到的方法是在 Parents 表中查找名称或其他属性以查找相应的父 ID,并返回该 ID。然后在添加子记录时,将该 ID 用作外键属性。我不想创建新的父记录,那么这是将子记录添加到现有父记录的唯一方法吗?互联网上的所有示例似乎都是同时添加一个新的父记录和子记录,而不是将子记录添加到现有的父记录中。非常感谢任何帮助。


要设置相关实体,您可以将导航属性设置为父实体,也可以设置外键。如果您知道ID但没有父级,则只需设置外键。如果您有父对象,只需设置导航属性。如果您既不知道ID也没有父对象,那么如何知道子实体所关联的父级呢? - Pawel
让我举个例子。假设父实体是教师,数据库中有Bob、Julie和Dave。子实体是班级,与一个教师对多个班级的关系相对应。我想给Julie添加一个班级,但是我没有她的主键ID,因为几天前我输入她时它是自动创建的。所以,我必须搜索教师名称属性中的“Julie”,返回她的主键ID,然后将其用作新班级外键吗? - user1626137
唯一识别Julie的方法是使用ID。原因是ID始终是唯一的,而姓名则不是。您可以使用类似于context.Teachers.First(t => t.Name == "Julie")的代码从数据库中获取实体,并使用ID或引用。设置关联的其他方法是无效的,因为您不知道要将关系设置为什么。还请注意,Julie可能在此期间已被删除。 - Pawel
1个回答

26
"Julie"(Lerman)是我们在EF方面的老师之一。正如她在她的书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,但对于您知道不会被删除的对象,您也可以将其保存在某些变量中以在事务之间重用。
使用前两个选项时,不需要手动将子对象添加到上下文中。 EF知道它是新的。在第三个选项中,在SaveChanges之前必须将其添加到context.Children中。

我已将此标记为答案,并指向了Pawel的评论,二者都证实了我的假设:在添加子项之前,我需要父实体或至少父ID。 P.S. 我拥有Julie的所有书籍和示例,在学习Entity Framework时非常有帮助。 - user1626137

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接