实体框架在请求从数据库返回之前返回值(null)

时间:2014-03-07 12:54:16

标签: c# multithreading entity-framework

我的数据库很简单:我有合同,客户和领域。每个合同只与一个客户相关联,每个客户只与一个区域相关联。因此:

Contract.Customer.Area.AreaId

始终是有效的,因为Area和Customer都不能为空。

现在,以下代码在工作线程中执行 (它使用主线程中创建的ObjectContext - 我知道,这不是一个好主意,但我'做代码维护):

if (something)
   CallA();
else if (Contract.Customer.Area.AreaId == (int)Area.Worldwide)
   CallB();

令人惊讶的是,当执行这些行时,Contract.Customer.Area当时为空 (并且第三行导致崩溃)。

使用EF Profiler,我看到实体框架在崩溃发生之前向数据库发送请求(以读取Area对象)。但它似乎没有等待回应......

另外:如果我在if上放置一个断点并逐步执行F10,Contract.Customer.Area始终有效。崩溃时也是如此:如果我将PC移至if并点击F10,Contract.Customer.Area也有效。

为什么区域为空的任何想法?我该如何纠正这个?使用Include预加载区域似乎有效......现在。

谢谢!

1 个答案:

答案 0 :(得分:0)

我假设您在没有显式加载相关实体的情况下激活了延迟加载,因此只有在访问它们时才会从数据库中提取Contract.CustomerContract.Customer.Area。这解释了为什么调试器始终显示有效值(调试器本身会在您尝试评估这些属性时导致执行SQL请求)。

至于您使用NRE的崩溃,可以猜测上下文已被处理,因此延迟加载不再起作用(即使我希望ObjectDisposedException而不是NRE)。

如何解决?明确加载您的实体。见http://msdn.microsoft.com/en-us/data/jj574232.aspx