我的数据库很简单:我有合同,客户和领域。每个合同只与一个客户相关联,每个客户只与一个区域相关联。因此:
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预加载区域似乎有效......现在。
谢谢!
答案 0 :(得分:0)
我假设您在没有显式加载相关实体的情况下激活了延迟加载,因此只有在访问它们时才会从数据库中提取Contract.Customer
和Contract.Customer.Area
。这解释了为什么调试器始终显示有效值(调试器本身会在您尝试评估这些属性时导致执行SQL请求)。
至于您使用NRE的崩溃,可以猜测上下文已被处理,因此延迟加载不再起作用(即使我希望ObjectDisposedException
而不是NRE)。
如何解决?明确加载您的实体。见http://msdn.microsoft.com/en-us/data/jj574232.aspx