【问题标题】:Entity Framework return a value (null) before the request return from the database实体框架在请求从数据库返回之前返回一个值(null)
【发布时间】:2014-03-07 12:54:15
【问题描述】:

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

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,我看到 Entity Framework 在崩溃发生之前向数据库发送了一个请求(以读取 Area 对象)。但它似乎没有等待响应......

另外:如果我在if 上放置一个断点并使用 F10 逐行遍历,Contract.Customer.Area 始终有效。崩溃时也是如此:如果我将 PC 移动到 if 并按 F10,Contract.Customer.Area 也有效。

任何想法为什么 Area 为空?我应该如何纠正这个?使用 Include 来预加载区域似乎可以工作......现在。

谢谢!

【问题讨论】:

  • (个人经验)大多数时候我得到一个空值,我真的不知道为什么,它与线程有关。但在你的情况下我不确定,因为我不知道你的代码。
  • 您能否发布客户和区域类
  • @BassamAlugili 它们是实体框架生成的类。它们是从 EDMX 文件生成的。上下文继承自 ObjectContext。谢谢:)

标签: c# multithreading entity-framework


【解决方案1】:

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

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

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

【讨论】:

  • 是的,它使用延迟加载。但是,上下文是在启动时创建的,并保存在一个静态变量中。它没有被处理,因为我可以在崩溃后加载另一个合约。感谢您的链接!
猜你喜欢
  • 1970-01-01
  • 2018-12-23
  • 2016-08-04
  • 2022-12-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-26
  • 1970-01-01
相关资源
最近更新 更多