是什么在我的 EF 上下文中将延迟加载启用设置为 false?



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

在不同的点,我检查它是否仍然是true通过使用这段代码(从实体对象获取上下文)。只有在运行多个线程时才会出现这个问题(加载一些实体,然后通过多线程代码传递它们)。它不会在代码中的任何一致点发生,因此不可能确定导致它的确切原因。

我想我只是希望有人能更了解EF的内部工作原理,给我一个提示…

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

因此,在你的情况下发生的事情可能是这样的:一个线程正在访问一个NavigationProperty,在它结束之前,另一个线程试图访问一个对象的导航属性附加到相同的上下文中。此时,延迟加载被暂时关闭,因此不加载任何数据。

EF明确地声明ObjectContext不是线程安全的,所以确保不同线程没有并发访问可能是一个好主意。

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

我记得在Julie Lerman的《Julie Lerman Book: programming EF》中读到过这个

你需要一个动态代理,用于延迟加载。你需要一个带有Virtual navigation属性的Public类

最新更新