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

时间:2011-12-14 03:33:15

标签: entity-framework objectcontext detach

当我使用Entity Framework时,我想在上下文中查询记录并将其添加到具有相同模式的另一个上下文中,在查询记录之后,我将其从上下文中分离出来,但相关的实体都离开了,有什么方法可以解决它吗?

提前致谢!

2 个答案:

答案 0 :(得分:8)

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

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

答案 1 :(得分: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 article on loading entities的链接。