4

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

提前致谢!

4

2 回答 2

8

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

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

于 2011-12-14T09:52:36.760 回答
3

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

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

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

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

这是一个关于加载实体的非常好的 MSDN文章的链接。

于 2011-12-14T03:50:01.733 回答