2009-03-03 100 views
0

對於我目前正在開發的項目的一部分,我有一組用於聯合動作的四個表。一個表是其他三個抽象的基礎上,每個表在我的EF模型中表示,像這樣:但是實體框架的繼承問題(每種類型的表)

EF Model -- Actions http://chris.charabaruk.com/system/files/images/EF+Model+Actions.png

有我目前這個面臨兩個問題。第一個問題是Actor(對User的引用)和Subject(對與每種動作類型關聯的類的實體的引用)在我的子類中爲null,儘管關聯的數據庫列中保存了與其關聯中的行的有效鍵表。雖然我可以通過ActorReferenceSubjectReference獲取密鑰,但這當然需要設置新的EF上下文並查詢它以查找引用的對象(因爲FooReference.Value也爲空)。

第二個問題是具體操作類和它們相關的實體類之間的關係的倒數結束總是沒有任何結果。例如,Task.RelatedActions,它應該給我所有的TaskAction對象,其中Subject指的是調用RelatedActions的特定任務對象,它完全沒有對象。同樣,數據庫中存在有效的行,實體框架不會將它們放入對象中並將它們交給我。

任何人都知道它是什麼我做錯了,我該怎麼辦才能使它工作?

更新:似乎沒有任何關係屬性在我的實體模型中工作了。 WTF ...

回答

5

我認爲你在這裏遇到的問題是,默認情況下,EF不會自動加載相關的實體。如果您加載實體,則除非您執行以下操作之一,否則對相關實體的集合或引用將爲空:

1)使用預先加載以便在單個查詢中檢索主實體和相關實體。爲此,請通過向Include方法添加調用來修改查詢。在上面的示例中,您可以使用以下查詢:

from a in context.Actions.Include("Actor") select a 

這將檢索與相關的Actor方法的每個操作。

2)使用顯式懶加載,當你需要它來獲取相關實體:

action1.ActorReference.Load() 

在將與.NET 4.0附帶的EF的版本,你也將具有以下附加選項:

3)打開隱式延遲加載,以便在引用導航屬性時自動檢索相關實體。

  • 丹尼
+0

我認爲你是對的。如果EF 1.0帶有隱式延遲加載,那將會很不錯,因爲直到我們獲得.NET 4.0和EF 2之後,它纔會是一年。 – 2009-03-05 02:21:06