什么在我的EF上下文中将LazyLoadingEnabled设置为false?

时间:2013-03-12 20:07:16

标签: entity-framework entity-framework-5

首先使用EF5数据库。在创建我的上下文时,我将ContextOptions.LazyLoadingEnabled设置为true。有些事情会改变为false(我们的代码中没有任何地方更改了设置)。

在不同的点上,我通过使用this snippet代码(从实体对象获取上下文)来检查它是否仍然是true。该问题仅在运行多个线程时显示(加载一些实体,然后通过多线程代码传递它们)。它不会出现在代码中的任何一致点上,因此无法确定究竟是什么导致它。

我想我只是希望有人可能对EF的内部运作有更多了解并给我一些线索......

2 个答案:

答案 0 :(得分:1)

实体框架上下文不是线程安全的。当多个线程访问延迟加载的属性时,会遇到您遇到的问题。内部EF在检查NavigationProperty的值时关闭延迟加载,然后重新打开它。 (见RelatedEnd.DisableLazyLoading()

因此,在您的情况下发生的事情可能是这样的:一个线程当前正在访问NavigationProperty,在它完成之前,另一个线程尝试访问附加到同一上下文的对象的导航属性。在那个时间点暂时关闭延迟加载,因此没有加载数据。

EF明确声明ObjectContext不是线程安全的,因此确保不同的线程不会发生并发访问可能是个好主意。

答案 1 :(得分:0)

LazyLoadingEnabled确定在访问导航属性时是否自动加载相关对象。

我记得在Julie Lermans书中读过这篇文章:programming EF by Julie Lerman

您需要一个动态代理,用于延迟加载。 您需要具有虚拟导航属性的Public类。