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
) 还指定 属性 在那里是可选的。
- 数据存储修复 - 或者更改数据存储架构和数据以使其与模型中的预期内容保持一致。
编辑:这不是不了解基本编程的问题(例如试图取消引用空对象引用)。
编辑:在 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>
或?
,并且如果您定义了映射( 通过属性或在inheritEntityTypeConfiguration
) 还指定 属性 在那里是可选的。 - 数据存储修复 - 或者更改数据存储架构和数据以使其与模型中的预期内容保持一致。