Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# TryGetCachedRelatedEnd中实体框架中的NullReferenceException_C#_Entity Framework - Fatal编程技术网

C# TryGetCachedRelatedEnd中实体框架中的NullReferenceException

C# TryGetCachedRelatedEnd中实体框架中的NullReferenceException,c#,entity-framework,C#,Entity Framework,我有一个实体链接到它周围的许多实体。这些实体仅链接回主实体。我在启动时手动“加载()”上下文中设置的每个实体(上下文在静态类中保持打开状态),我尝试过延迟加载和延迟加载,两者都会导致相同的异常 如果我在运行时查看核心实体(Person实体),任何具有一个或多个相关记录的相关实体都可以正常工作。如果相关实体没有相关记录(即count=0),则会引发NullReferenceException?!以下是异常的堆栈跟踪: at System.Data.Entity.Core.Objects.Da

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

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

   at System.Data.Entity.Core.Objects.DataClasses.RelationshipManager.TryGetCachedRelatedEnd(String relationshipName, String targetRoleName, RelatedEnd& relatedEnd)
就是这样,这就是整个堆栈跟踪

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

仅供参考,“ActiveHours”和“ActiveEmployments”都是从“Employments”中提取出来的,并通过分部类添加到实体中

引发异常的代码是:

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

当我对它进行断点时,Employments会创建NullReferenceException——这在Microsoft的实体框架代码中也是如此(如堆栈跟踪所示)。

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

总之:
EF Lazy Loaded=线程不安全(可理解)
EF Eager Loaded=线程不安全(为真,但谁知道为什么?


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

可能重复的
员工的代码和引发此异常的代码是什么?@GertArnold更新了帖子,显示引发此异常的代码。@PeterDuniho我知道什么是NullReferenceException,以及如何解决它,但是如果我不拥有或者看不到代码或者找不到异常的逻辑原因,我就无法解决它,可以吗?这就是我穿上它的原因。