2010-11-04 62 views
0

我知道這已經以幾種方式問過,但沒有一個答案似乎適用於我 - 或正確 - 或最新,所以我會再試一次。EF4 - 自我跟蹤的實體和繼承和熱切加載

我有一個很大的模型,有幾個物體的繼承實體。一個示例是包含TimetableEvent集合的時間表。 TimetableEvent有幾種子類型,如InterviewTimetableEvent,BreakTimetableEvent和ExercisetimeTableEvent。 ExerciseTimetableEvent與練習實體有關係。

我需要使用自我跟蹤實體,因爲我使用WCF後端以無狀態方式向多個WPF客戶端提供數據。

所以,我需要加載一切,我認爲自我跟蹤的實體會自動做到這一點,但它似乎沒有。

因此,要獲得一個時間表,我需要做這樣的事情:

  var tt = (from s in ESSDataContainer.Timetables 
        .Include("TimetableEvents") 
        where s.TimetableId == timetableid 
        select s).FirstOrDefault(); 

這會給我TimetableEvents但不是都跟ExerciseTimetableEvents練習。我試過以下(和幾個其他建議),但沒有運氣:

  var tt = (from s in ESSDataContainer.Timetables 
        .Include("TimetableEvents") 
        .Include("ExerciseTimetableEvents.Exercise") 
        where s.TimetableId == timetableid 
        select s).FirstOrDefault(); 

有沒有解決方案呢?

如果沒有,我會回到正常的上下文跟蹤,並從本地容器連接到數據庫,而不是使用WCF。

乾杯

+0

作爲一個簡要說明,我只想補充一點,經過多年來多次嘗試使數據訪問變得簡單易行,微軟(以及幾乎所有其他人)都失敗了!這總是比應該更難。這應該是諾貝爾獎......那麼我們可能會看到一些真正易用的東西! – Jonesie 2010-11-04 05:54:14

+0

做這樣的陳述時要小心,你會在這裏引起騷亂。和你的Q一樣,我遇到了同樣的問題。你不能急於加載派生關係,因爲你不知道它的類型。我發現的唯一解決方案是將導航移至父級或2個數據庫調用。 – RPM1984 2010-11-04 09:23:13

+1

@ RPM1984查看我的答案,瞭解沒有模式更改或多次調用的解決方案。 – 2010-11-04 14:50:03

回答

2

這是一個有點棘手,但有可能:

var tt = (from s in ESSDataContainer.Timetables 
      where s.TimetableId == timetableid 
      select new 
      { 
       TimeTable = s, 
       Events = s.TimeTableEvents, 
       Exercise = s.TimeTableEvents.OfType<ExerciseTimetableEvents>() 
              .Select(ett => ett.Exercise) 
      }).Select(s => s.TimeTable) 
      .AsEnumerable() 
      .FirstOrDefault(); 

清除泥漿,但是,嘿:無魔弦!此外,它的優點是它實際上工作....

+0

非常感謝。我現在可以看到這是如何工作的,爲什麼這是必要的,但是,呃,這很醜陋。我並不熱衷於在整個模式中執行此操作,儘管如此我還是恢復了容器跟蹤,並將數據層連接到每個客戶端的sql,而不是爲它提供wcf服務。這是一個恥辱,但預算和時間已經出來解決這個問題了。 – Jonesie 2010-11-04 18:35:17

+0

不錯的+1。我已經讀了三次,但仍然不明白。 :) @克雷格Stuntz - 你可以看看一個較早的Q我貼:http://stackoverflow.com/questions/4011211/entity-framework-4-abstract-model-how-to-programatically-eager-load-navigationa和看看這是否可以應用於我的?會真的很感激它。我認爲我的情況有點棘手。 – RPM1984 2010-11-04 21:13:52

+0

@ RPM1984,我不認爲我會這樣做,在我不知道什麼類型回來的情況下。 – 2010-11-04 21:18:19

0

有一個建議,爲此issua在Microsoft Connect:。如果你認爲這個有價值的話,你可以投票贊成。