编辑:这不是一个忽略基本编程的问题(比如试图解引用一个空对象引用)。
编辑:在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查询窗口中并获得适当的结果。我也得到了一个没有Where调用的NRE。
我已经尝试从数据库更新我的模型来刷新任何东西。我试过从模型中删除视图并更新。我试过完全删除模型并重新创建它。我已经重新启动了Visual Studio和我的计算机。我得到相同的NRE查询。我不知道我还可以尝试什么,这个NRE对我来说根本没有意义,因为我得到了我期望使用EF以外的所有东西的结果。如果我以前没有看到它工作,我会把它记为EF的一个bug。
有人处理过吗?在网上搜索这组特定的情况一无所获。
堆栈跟踪:
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>
或?
为可空的值类型,如果您定义了映射(通过属性或继承EntityTypeConfiguration
的类型),也指定该属性在那里是可选的。 - 数据存储修复-或者更改数据存储模式和数据,使其与模型中的预期保持一致。