提问人:Pfhoenix 提问时间:9/22/2016 最后编辑:IgorPfhoenix 更新时间:9/22/2016 访问量:1036
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();
这一直有效,直到它神秘地停止。 是 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()
答:
2赞
Igor
9/22/2016
#1
问题在于,您的模型(在上面的示例中)具有一个或多个不可为空的属性(并且可能在映射中也被标记为不可为空),但数据存储中的相应列是可为空的。只有在检索到具有其中一列值的记录时,此异常才会显现出来。Tree
null
- 模型修复 - 更新模型时,请确保使用 或 对于可为 null 的值类型,并且如果定义了映射(通过属性或在继承
EntityTypeConfiguration
的类型中),则还要在此处指定该属性是可选的。Nullable<T>
?
- 数据存储修复 - 或者,更改数据存储架构和数据,使其与模型中的预期内容保持一致。
评论
dbcontext
dbcontext.Tree
Left
Right