2011-04-19 55 views
0

我有一個從「BaseEntity」派生的「投資」實體。實體框架4:爲什麼我無法獲得派生實體的ObjectSet而不是ObjectQuery?

隨着_container.BaseEntities.OfType<Investment>()我得到的總是查詢數據庫中的ObjectQuery。

因此我寧願有一個ObjectSet<Investment>

我不明白爲什麼EF不支持此派生實體...還是沒有呢? ;)

如果我會繼續在EF(這將是愚蠢的),創建與所有我的派生實體關聯的「根實體」,我會通過該根的導航屬性獲得EntityCollections實體-實體。但是,必須有另一種方式......

乾杯

回答

0

ObjectQuery<T>並不總是查詢數據庫。這只是一個查詢規範 - 在這種情況下,規範返回Investment類型的所有BaseEntities。您可以使用其他過濾器或orderby子句或投影等來編寫它。在您應用一些貪婪的運算符(如ToList()First()等)或直到您應用foreach循環來獲取結果之前,數據庫中不會執行任何操作。

+0

我明白了!但是對於非繼承實體,像你一樣的簡單對象讓你添加對象並將它們保存在內存中。如果您使用_container.BaseEntities.AddObject(投資)添加「投資」並且您做了_container.BaseEntities.OfType ().ToList,則添加的「投資」不在該列表中,因爲它尚未保存到數據庫中。因此,如果我可以有一個ObjectSet 會更容易! – SolarX 2011-04-19 13:26:18

+1

@SolarX:對不起,我誤解了你的問題的背景。 '_container.BaseEntities.ToList()'會返回已添加但尚未保存的投資實體嗎?無論如何,你應該把這個問題編輯成你的問題,這使問題背後的原因更清晰,也許有人知道一個解決方法。 – Slauma 2011-04-19 15:08:15

+0

不用擔心:)今天的EF JUT讓我有點前衛;)非常感謝您的協助! – SolarX 2011-04-19 15:28:29

1

也就是說它是如何工作的EF ObjectContext的API。如果您嘗試派生實體創建ObjectSet您將獲得:

ArgumentException的:有指定的 實體型「投資」沒有定義 EntitySets。如果 「投資」是派生類型,請改用基本類型 。參數名稱: 實體

同樣,一旦您定義了繼承,派生實體就沒有導航屬性。提供導航屬性的關聯被改爲繼承。

我也跟着你的former questions這可能是這一個來源,我必須說,我嘗試了很多,但我永遠不能得到你的行爲。即使我直接調用Count到ObjectSet,我總是會得到SQL查詢(在配置文件中檢查)和數據庫中的實體數量 - 不在集合中。

+0

嗨,如果我有一個導航屬性「報告」的「投資」和報告也來自「BaseEntity」,此導航屬性返回一個EntityCollection 。這可以。我可能會混淆ObhectSet和EntityCollection關於緩存實體上的「Count()」。非常感謝您的幫助! – SolarX 2011-04-20 08:02:47