【问题标题】:Entity Framework - Add Child Entity实体框架 - 添加子实体
【发布时间】:2012-10-31 16:40:25
【问题描述】:

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

【问题讨论】:

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

标签: entity-framework parent-child


【解决方案1】:

“朱莉”(勒曼)恰好是我们的一名教师,谈到英孚。正如她在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 才能添加孩子。附:我有 Julie 的所有书籍和示例,它们对学习 Entity Framework 有很大帮助。
猜你喜欢
  • 1970-01-01
  • 2023-04-01
  • 2013-05-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多