实体框架分离实体和相关实体消失

Posted

技术标签:

【中文标题】实体框架分离实体和相关实体消失【英文标题】:Entity Framework Detach an entity and the related entities gone 【发布时间】:2011-12-14 03:33:15 【问题描述】:

当我使用实体框架时,我想在上下文中查询出一条记录并将其添加到具有相同架构的另一个上下文中,在查询出记录后,我将其从上下文中分离出来,但相关实体都消失了,有什么办法解决吗?

提前致谢!

【问题讨论】:

什么意思“相关实体都走了” 【参考方案1】:

这是“设计使然”。 EF 只能一个一个地分离实体,但同时 EF 不支持由附加实体和分离实体组成的对象图。因此,当您分离实体时,它将破坏与附加对象图的其余部分的所有关系。目前不支持分离整个对象图,但您可以在 Data UserVoice 上投票支持此功能。

作为一种解决方法,您可以关闭上下文的延迟加载,使用@CodeWarrior 描述的急切加载来准确加载您需要传递给其他上下文的数据。加载数据后,将它们序列化为流式传输并立即将它们反序列化为对象图的新实例。这是如何对已分离但所有关系完整的实体图进行深度克隆的方法(需要关闭延迟加载,否则序列化也会加载所有其他导航属性,这可能会导致对象图比预期的大得多)。唯一的要求是您的实体必须可由您选择的序列化程序进行序列化(注意循环引用,这通常需要对您的实体进行一些特殊处理或附加属性)。

【讨论】:

【参考方案2】:

您是在问如何加载子实体?如果是这样,您可以使用 .Include 方法进行预加载。给定一个 Person 类和一个 PhoneNumber 类,其中 Person 有一个 PhoneNumber 的集合,您可以执行以下操作:

List<Person> People = db.People.Where(p => p.Name = "Henry")
                               .Include("PhoneNumbers")
                               .ToList();

或者您可以执行所谓的显式加载,在此加载实体并在要加载的子实体和相关实体的集合上调用 .Load 方法。通常,您在未启用 LazyLoading 时执行此操作(并且在 4.0+ 中默认启用 LazyLoading,不要回忆以前的版本)。

无论您如何查询和加载它们,您都必须分离要附加到不同上下文的实体。

这是一个相当不错的 MSDN article on loading entities 的链接。

【讨论】:

以上是关于实体框架分离实体和相关实体消失的主要内容,如果未能解决你的问题,请参考以下文章

实体框架分离的实体不相等

实体框架:使用分离的对象和附加的对象

在 Entity Framework 6 中保存分离的实体

在相关实体上发生 ConstraintViolation 后 Hibernate 对象分离

分离实体和被管理实体

实体框架代码优先 - DbContext 上没有 Detach() 方法