2

編輯:這不是無知的基本編程(如試圖解引用空對象引用)的問題。實體框架6查詢生成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查詢窗口中,並獲得正確的結果。我也可以在沒有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() 
+0

請在將其標記爲可能的副本之前,充分理解被問到的問題。 – Pfhoenix

+0

請包括[最小,完整和可驗證示例](http://stackoverflow.com/help/mcve)。另請閱讀[我如何提出一個好問題](http://stackoverflow.com/help/how-to-ask)。由於您的問題目前已經編寫,所以NRE的副本是您問題的唯一和最佳解決方案。您提供了沒有堆棧跟蹤,沒有提及什麼是實際爲空(或不是這個問題:例如'dbcontext' null?是'dbcontext.Tree' null?是結果dbcontext.Tree.ToList()null或拋出NRE )或其他任何細節。 – Igor

+0

因此,數據中的所有樹都具有「Left」和「Right」的值? – trailmax

回答

0

的問題是,你的模型(Tree在上面的例子)具有一個或多個場所中不可爲空(並且也可能被標記爲在映射不可爲空但是數據存儲中的相應列是可以爲空的。只要有一個記錄被檢索到,其中一個列的值爲null,該異常就會顯示出來。

  • 模式修復 - 當更新模型一定要使用空值類型Nullable<T>?,如果您有(通過屬性或繼承EntityTypeConfiguration類型)定義的映射也指定該屬性是可選那裏。
  • 數據存儲修復 - 或者更改數據存儲架構和數據以使其與模型中的預期對齊。