10

首先使用 EF5 数据库。在创建上下文时,我设置ContextOptions.LazyLoadingEnabledtrue. 发生了一些事情来改变它false(在我们的代码中没有任何地方改变了设置)。

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

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

4

2 回答 2

1

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

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

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

于 2015-05-05T14:31:54.630 回答
0

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

我记得在 Julie Lermans 的书中读到这个:Julie Lerman 的 Programming EF

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

于 2013-05-19T14:34:42.333 回答