2011-12-14 133 views
4

当我使用实体框架时,我想查询上下文中的记录并将其添加到具有相同模式的另一个上下文,在查询出记录后,我将它从的背景下,但相关的实体都走了,有什么办法解决它?实体框架分离实体和相关实体

在此先感谢!

+0

你是什么意思*“相关实体全部离开”*? – Yuck 2011-12-14 17:53:26

回答

8

这是“按设计”。 EF只能逐个分离实体,但同时EF不支持由连接和分离的实体组成的对象图。正因为如此,当你分离实体时,它将把所有的关系都打破到附加对象图的其余部分。目前不支持分离整个对象图,但您可以在Data UserVoice上投票支持此功能。

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

3

你问的是如何加载子实体?如果是这样,您可以使用.Include方法进行急切的加载。给定一个Person类和那里的人有******中国的集合类******中国,你可以做到以下几点:

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

或者你可以做所谓的显式加载在这里装载的实体和拨打.Load方法在你想要加载的子和相关实体的集合上。一般来说,当你没有启用LazyLoading时,你会这样做(并且LazyLoading在4.0+中默认启用,在以前的版本中不记得)。

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

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

+0

感谢您的回复! – James 2011-12-15 03:11:44

+0

没问题。请记住投票支持你的帖子。 – CodeWarrior 2011-12-15 05:53:56