首先使用EF5数据库。在创建我的上下文时,我将ContextOptions.LazyLoadingEnabled
设置为true
。有些事情会改变为false
(我们的代码中没有任何地方更改了设置)。
在不同的点上,我通过使用this snippet代码(从实体对象获取上下文)来检查它是否仍然是true
。该问题仅在运行多个线程时显示(加载一些实体,然后通过多线程代码传递它们)。它不会出现在代码中的任何一致点上,因此无法确定究竟是什么导致它。
我想我只是希望有人可能对EF的内部运作有更多了解并给我一些线索......
答案 0 :(得分:1)
实体框架上下文不是线程安全的。当多个线程访问延迟加载的属性时,会遇到您遇到的问题。内部EF在检查NavigationProperty的值时关闭延迟加载,然后重新打开它。 (见RelatedEnd.DisableLazyLoading()
)
因此,在您的情况下发生的事情可能是这样的:一个线程当前正在访问NavigationProperty,在它完成之前,另一个线程尝试访问附加到同一上下文的对象的导航属性。在那个时间点暂时关闭延迟加载,因此没有加载数据。
EF明确声明ObjectContext不是线程安全的,因此确保不同的线程不会发生并发访问可能是个好主意。
答案 1 :(得分:0)
LazyLoadingEnabled
确定在访问导航属性时是否自动加载相关对象。
我记得在Julie Lermans书中读过这篇文章:programming EF by Julie Lerman
您需要一个动态代理,用于延迟加载。 您需要具有虚拟导航属性的Public类。