Entity Framework如何分离一个实体以及相关的实体也被删除

4

当我使用 Entity Framework 时,我想从一个上下文中查询出一条记录,并将其添加到具有相同架构的另一个上下文中。在查询出该记录后,我会将其从上下文中分离,但相关实体都消失了。有没有解决方法?

提前致谢!


1
你说的“相关实体都不在了”是什么意思? - Yuck
2个回答

8
这是“按设计实现”的。EF 只能逐个分离实体,但同时 EF 不支持由已连接和已分离实体组成的对象图。因此,当您分离实体时,它将断开与其余附加对象图的所有关系。目前不支持分离整个对象图,但您可以在 Data UserVoice 上投票支持此功能。
作为解决方法,您可以关闭上下文中的延迟加载,在 @CodeWarrior 描述的急切加载中使用恰好需要传递到其他上下文的数据。一旦加载了数据,请将其序列化到流中,并立即将其反序列化到对象图的新实例中。这是制作已分离但具有所有关系完整的实体图的深层克隆的方法(需要关闭延迟加载,否则序列化还会加载所有其他导航属性,这可能导致比预期更大的对象图)。唯一的要求是您的实体必须可由所选的序列化器进行序列化(请注意循环引用通常需要一些特殊处理或对实体的其他属性进行附加属性)。

3

您是在询问如何加载子实体吗?如果是,您可以使用.Include方法进行急切加载。假设有一个Person类和一个PhoneNumber类,其中Person有一个PhoneNumber集合,您可以执行以下操作:

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

或者,您可以采用显式加载的方式,在加载实体后调用子实体和相关实体集合的 .Load 方法。通常在没有启用惰性加载时这样做(在 4.0+ 中默认启用了 LazyLoading,以前的版本我不记得了)。

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

这里有一个链接,指向一篇相当不错的 MSDN 文章,详细介绍了如何加载实体。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接