2016-11-14 44 views
-1

我已經構建了一個非常extenxive EF查詢,結果是錯誤的。在哪裏和爲什麼似乎無法追查,因爲我的內隱感覺只是返回null。我希望有人能夠指引我正確的方向。我用this open on my second monitor.EF包含查詢結果有問題,內部異常爲空

var databaseRequirementVersions = context.RequirementVersions 
      .Include(x => x.Requirement) 
      .Include(x => x.RequirementDetails) 
      .Include(x => x.TaggedValueRequirementCouplers) 
      .Include(x => x.TaggedValueRequirementCouplers.Select(y => y.TaggedValueVersion)) 
      .Include(x => x.TaggedValueRequirementCouplers.Select(y => y.TaggedValueVersion.TaggedValue)) 
      .Include(x => x.ConnectorRequirementCouplers) 
      .Include(x => x.ConnectorRequirementCouplers.Select(y => y.ConnectorVersion)) 
      .Include(x => x.ConnectorRequirementCouplers.Select(y => y.ConnectorVersion.Connector)) 
      .Include(x => x.ConnectorRequirementCouplers.Select(y => y.ConnectorVersion.ConnectorDetails)) 
      .Include(x => x.ConnectorRequirementCouplers.Select(y => y.ConnectorVersion.TaggedValueConnectorCouplers)) 
      .Include(x => x.ConnectorRequirementCouplers.Select(y => y.ConnectorVersion.TaggedValueConnectorCouplers.Select(a => a.TaggedValueVersion))) 
      .Include(x => x.ConnectorRequirementCouplers.Select(y => y.ConnectorVersion.TaggedValueConnectorCouplers.Select(a => a.TaggedValueVersion.TaggedValue))) 
      .Where(x => x.Requirement.Guid == element.ElementGUID); 

快速破壞了數據庫;
RequirementVersions總是具有1項要求(要求可以有多個版本)
RequirementVersions總是具有1個RequirementDetails
RequirementVersions具有多個TaggedValueRequirementCouplers(耦合器表)
RequirementTaggedValueVersion具有多個TaggedValueRequirementCouplers(耦合器表)
RequirementTaggedValueVersion總是具有1個RequirementTaggedValue (RequirementTaggedValue可以有多個版本)

RequirementVersions有多個ConnectorRequirementCouplers(耦合器表)
Connecto rVersion具有多個ConnectorRequirementCouplers(耦合器表)
ConnectorVersion總是具有1連接器(連接器可以具有多個版本)
ConnectorVersion總是具有1個ConnectorDetails
ConnectorVersion具有多個ConnectorTaggedValueCouplers(耦合器表)
ConnectorTaggedValueVersion具有多個ConnectorTaggedValueCouplers(聯接器的表)
ConnectorTaggedValueVersion具有1個ConnectorTaggedValue(ConnectorTaggedValue可以有多個ConnectorTaggedValueVersions)

例外: enter image description here 堆棧跟蹤從MoreLinq MaxBy<>開始,它位於包含語句下方,它嘗試發出以下代碼行;

var MyList = new List<RequirementVersion>(); 
MyList.Add(databaseRequirementVersions?.MaxBy(x => x.Version)); 

我已經做了什麼來得出結論我的.Include是壞的;
當我註釋掉(//)所有.Include的比第2層(所以任何打算過去y. - 這意味着y.ConnectorVersion的作品,但y.ConnectorVersion.Connector,或(假設)y.ConnectorVersion.Select(z => z.Connector)不工作)不斷深入查詢被接受。

正如我似乎無法通過自己與可用的工具來算出這個一出來,我希望有人能指出我在正確的方向..

編輯: @Evk要我改變MaxBy<> -statement以確保它不會導致問題本身,所以這裏是新的(相同的?)異常; enter image description here

+1

什麼爛攤子。完成惡夢維護和調試。 –

+0

從簡單檢查開始:啓用數據庫日誌(context.Database.Log = Console.WriteLine或其他)。去掉 」?」這裏>「databaseRequirementVersions?」。用FirstOrDefault()替換MaxBy。 – Evk

+0

另請檢查InnerException。這是什麼意思 –

回答

0

所以我做了什麼來找我的答案;
通過在我的DbContext構造函數中包含以下代碼行;

var logPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), @"Folder\DatabaseLog.log"); 
this.DbContext.Database.Log = (s) => File.AppendAllText(logPath, s); 

我設法創建了一個相當廣泛的登錄數據庫通信的地方。它顯示錯誤發生的地點和原因。實際的錯誤在答案(列/表引用中的錯字)方面沒有太大的差別,但日誌記錄在找到答案時發揮了巨大的作用;

非常感謝您對@Evk的日誌建議