Entity Framework 6 查询生成 NullReferenceException

Entity Framework 6 query generates NullReferenceException

编辑:这不是不了解基本编程的问题(例如试图取消引用空对象引用)。​​

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

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

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

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

我试过从数据库更新我的模型来刷新任何东西。我试过从模型中删除视图并进行更新。我试过完全删除模型并重新创建它。我已经重新启动 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()

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

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