2016-12-01 20 views
0

長期來訪者,初次發帖,請原諒我的經驗不足。我正在使用MVC 5項目和使用EF 6.1的代碼庫項目在VS 2015解決方案中工作。我已經在VS 2013中重做了以前版本的整個項目,希望能夠解決這個問題,但沒有運氣。我只是試圖與孫子們一起爲孩子着想。我嘗試這樣做:EF - 渴望包括孫子不工作,不包含'精選'的定義

  Test t = db.Tests 
       .Include("TestsRemoteOBD") 
       .Include("TestsRemoteOBD.TestsRemoteOBDDtcs") 
       .FirstOrDefault(); 

這:

  Test t = db.Tests 
       .Include(i=>i.TestsRemoteOBD) 
       .Include(i=>i.TestsRemoteOBD.Select(s=>s.TestsRemoteOBDDtcs)) 
       .FirstOrDefault(); 

包括使用字符串適用於兒童,但不是孫子。而隨着第二查詢,我得到這個錯誤:

TestsRemoteOBD」不包含可以發現「Select」的定義,並沒有擴展方法「選擇」接受型「TestsRemoteOBD」第一個參數(是你缺少using指令或程序集引用?)

我見過加入「using System.Data.Entity;」解決同樣的問題,但我這樣做了很久以前。沒有幫助。還有什麼我可以錯過?

謝謝!

+0

第一個片段給你什麼錯誤? –

+0

'TestsRemoteOBD'是一個集合嗎? –

+0

從錯誤消息看起來像'TestRemoteOBD'是一個單一的實體引用,所以只需刪除'選擇'。 –

回答

0

非常感謝所有那些評論。至少,我本來會一直盯着我的腦袋。如果父[Tests]與[TestRemoteOBD]有一對多的關係,那麼我寫第二條語句的方式就可以正常工作,但由於後者不是集合,因此沒有定義「Select」。我沒有測試,但我相信它應該是這樣的:

Test t = db.Tests 
      .Include(i=>i.TestsRemoteOBD) 
      .Include(i=>i.TestsRemoteOBD.TestsRemoteOBDDtcs) 
      .FirstOrDefault(); 
+0

我仍然無法像加載TestsRemoteOBDDtcs一樣,如果我在處理datacontext後查看它,仍然會收到異常。我發現,如果我在datacontext打開時檢查t.TestsRemoteOBDDtcs.Count(),那麼在關閉後我可以很好地閱讀它。這是我的短期修復,我將繼續前進,儘量不去想,但會繼續檢查,看看有沒有人有想法。再次感謝所有人!很好理解爲什麼我看到'選擇未定義'。 –

1

凹凸。發現這一點,並認爲我會拋出我自己的研究。

微軟 Documentation 狀態:將包括參考,然後參考下一層:query.Include(E => e.Level1Reference.Level2Reference) - 但是這似乎並沒有在哪怕是最簡單的工作用例。使用.ToList()執行查詢實際上並不包含任何內容。聞起來像是一個明顯的bug!

我可以看到2個解決方法。首先,如本文所示,您可以手動迭代實體來強制EF加載它們。 其次,如果作用域允許,您可以忘記'使用'塊,並將dbcontext的更永久實例保留爲類成員,以便在訪問成員時仍然可用,不會丟棄(System.ObjectDisposedException)。

+0

感謝您的跟進。我從來沒有修復它。 –

+0

這個問題出現了,我在EF核心工作,在不同的項目,並在較新的框架,你可以解決這樣的原始問題的前一天......測試t = db.Tests .Include(i => i .TestsRemoteOBD) 。ThenInclude(t => t.TestsRemoteOBDDtcs) .FirstOrDefault(); –