首先使用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类