Entity Framework 6 查询生成 NullReferenceException

Entity Framework 6 query generates NullReferenceException

提问人:Pfhoenix 提问时间:9/22/2016 最后编辑:IgorPfhoenix 更新时间:9/22/2016 访问量:1036

问:

编辑:这不是对基本编程一无所知的问题(例如尝试取消引用空对象引用)。

编辑:在 Linqpad 中添加了来自 EF 的堆栈跟踪。

使用 EF6,我有一个非常简单的查询:

var menu = dbcontext.Tree.Where(t => t.Left > 2 && t.Right < 10).ToList();

这一直有效,直到它神秘地停止。 是 SQL Server 2012 中的视图。使用 Linqpad5,我使用其内置连接获得了我期望的结果。设置与我的项目的 EF 连接后,我得到了 NRE。检查 SQL,我可以将其复制并粘贴到 SQL 查询窗口中并获得正确的结果。我也得到了一个没有 Where 调用的 NRE。dbcontext.Tree

我尝试从数据库更新我的模型以刷新任何内容。我尝试从模型中删除视图并更新。我尝试完全删除模型并重新创建它。我重新启动了 Visual Studio 和我的计算机。我得到查询的相同 NRE。我不知道我还能尝试什么,这个 NRE 对我来说根本没有意义,因为我使用除了 EF 之外的所有东西都得到了我期望的结果。如果我以前没有看到它工作,我会将其归咎于 EF 的错误。

有人处理过这个问题吗?在网上搜索这组特定情况一无所获。

堆栈跟踪:

at System.Data.Entity.Core.EntityKey.AddHashValue(Int32 hashCode, Object keyValue)
at System.Data.Entity.Core.EntityKey.GetHashCode()
at System.Collections.Generic.GenericEqualityComparer`1.GetHashCode(T obj)
at System.Collections.Generic.Dictionary`2.FindEntry(TKey key)
at System.Collections.Generic.Dictionary`2.TryGetValue(TKey key, TValue& value)
at System.Data.Entity.Core.Objects.ObjectStateManager.TryGetEntityEntry(EntityKey key, EntityEntry& entry)
at System.Data.Entity.Core.Objects.ObjectStateManager.FindEntityEntry(EntityKey key)
at System.Data.Entity.Core.Common.Internal.Materialization.Shaper.HandleEntityAppendOnly[TEntity](Func`2 constructEntityDelegate, EntityKey entityKey, EntitySet entitySet)
at lambda_method(Closure , Shaper )
at System.Data.Entity.Core.Common.Internal.Materialization.Coordinator`1.ReadNextElement(Shaper shaper)
at System.Data.Entity.Core.Common.Internal.Materialization.Shaper`1.SimpleEnumerator.MoveNext()
at System.Data.Entity.Internal.LazyEnumerator`1.MoveNext()
sql-server 实体框架-6 nullreferenceexception ef-database-first

评论

0赞 Pfhoenix 9/22/2016
在将问题标记为可能的重复之前,请完全理解所提出的问题。
0赞 Igor 9/22/2016
请提供“最小”、“完整”和“可验证”示例。另请阅读如何提出好问题。由于您的问题目前正在编写,因此 NRE 的副本是您问题的唯一和最佳解决方案。您没有提供堆栈跟踪,也没有提到实际为 null 的内容(或者没有提到:示例是 null 吗? 是 null 吗? 是结果 dbcontext。Tree.ToList() null 或抛出 NRE) 或任何其他细节。dbcontextdbcontext.Tree
0赞 trailmax 9/22/2016
因此,数据中的所有树都具有 和 的值?LeftRight
1赞 Pfhoenix 9/23/2016
伊戈尔,你是对的。但是,我的问题被逆转了 - 我修改了视图使用的表,并且忘记刷新视图,使其不再与 EF 预期匹配。谢谢你的帮助。我会把它标记为答案,但我似乎无法做到。

答:

2赞 Igor 9/22/2016 #1

问题在于,您的模型(在上面的示例中)具有一个或多个不可为空的属性(并且可能在映射中也被标记为不可为空),数据存储中的相应列是可为空的。只有在检索到具有其中一列值的记录时,此异常才会显现出来。Treenull

  • 模型修复 - 更新模型时,请确保使用 或 对于可为 null 的值类型,并且如果定义了映射(通过属性或在继承 EntityTypeConfiguration 的类型中),则还要在此处指定该属性是可选的。Nullable<T>?
  • 数据存储修复 - 或者,更改数据存储架构和数据,使其与模型中的预期内容保持一致。