【问题标题】:NullReferenceException in Entity Framework from TryGetCachedRelatedEnd来自 TryGetCachedRelatedEnd 的实体框架中的 NullReferenceException
【发布时间】:2015-05-20 07:37:21
【问题描述】:

我有一个实体,它链接到它周围的许多实体。这些实体仅链接回主实体。我在启动时手动“加载()”设置上下文中的每个实体(上下文在静态类中保持打开状态),我已经尝试过开启和关闭延迟加载,并且都导致相同的异常。

如果我在运行时查看核心实体(Person 实体),任何具有一个或多个相关记录的相关实体都可以正常工作。任何没有相关实体的相关记录(即 count = 0)的地方都会引发 NullReferenceException?!这是异常的堆栈跟踪:

   at System.Data.Entity.Core.Objects.DataClasses.RelationshipManager.TryGetCachedRelatedEnd(String relationshipName, String targetRoleName, RelatedEnd& relatedEnd)

就是这样,这就是整个堆栈跟踪。

这是数据的屏幕截图,向您展示我的意思: “地址”之所以有效,是因为它有相关记录。 “员工”之所以有效,是因为它有相关记录。 “Employments”不起作用,因为没有记录,但它应该说 Count = 0 not null 引用异常?!

仅供参考,“ActiveHours”和“ActiveEmployments”都在“Employments”中起作用,并通过部分类添加到实体中。

抛出异常的代码是:

this.Employments.Where(employment => employment.IsActive);

当我对它进行断点时,Employs 会创建 NullReferenceException - 所以它在 Microsoft 的实体框架代码中(如堆栈跟踪中所示)。

【问题讨论】:

  • Employments的代码是什么,什么代码会抛出这个异常?
  • @GertArnold 已更新帖子以显示引发异常的代码。
  • @PeterDuniho 我知道 NullReferenceException 是什么以及如何解决它,但如果我不拥有或看不到代码或找不到异常的逻辑原因,我无法解决它一世?因此,我把它放在 SO 上的原因。

标签: c# entity-framework


【解决方案1】:

我想我终于弄清楚了问题所在,尽管它的错误消息完全具有误导性(尽管我现在知道为什么它也不能更具描述性)。我把这个答案放在这里,以防其他人遇到它并遇到与我相同的问题。基本上,问题是多线程。我知道人们会说什么;实体框架不支持多线程,我已经知道了,但我认为这是因为延迟加载并作为线程需要添加到集合中。所以我使用急切加载来预加载所有数据。如果我在没有多线程的情况下遍历所有数据,则所有值都有效,没有错误。即使我使用多线程快速搜索属性,大多数时候它也可以工作,只是做一个非常简单和快速的检查(因此我的大多数测试都没有引发异常)。为了保证我得到了异常,我必须将多线程搜索包装在一个 1000 次的 for 循环中,以确保我得到错误消息。这就是我最终发现问题的方式。尽管实际上急切地加载了所有数据,但实体框架使用的内部集合/列表也必须不是线程安全的。如果它们已经被填充(没有附加或删除),我会觉得很奇怪。

总结:
EF 延迟加载 = 不是线程安全的(可以理解)
EF Eager Loaded = 不是线程安全的(没错,但谁知道为什么?)

无论如何,如果其他人遇到这种情况,我希望这可能对其有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多