2010-06-29 43 views
0

我有TPT繼承+外鍵的問題。我正在開發多語言支持的Web應用程序,包括翻譯動態內容。 這裏是我的表:TPT和外鍵問題

Language 
============= 
Id, Name 


ProcessingAgent 
==================== 
Id, some other fields 

LocalizedProcessingAgent 
========================================================= 
LocalizedProcessingAgentId, Name, Description, LanguageId 

正如你已經猜到了,我搬到這應該被翻譯從ProcessingAgentLocalizedProcessingAgent列。在EF方面,我做了TPT繼承,所以ProcessingAgentLocalizedProcessingAgent的基類。 我是新來的EF,這是我第一個移動的項目,其中一個奇怪的行爲讓我很困惑。 當我從DB生成EF類時,LocalizedProcessingAgent具有導航屬性語言(由於LanguageId)。問題是,Language屬性爲空後,我查詢數據庫:

LocalizedProcessingAgentRecord l = db.ProcessingAgents 
    .OfType<LocalizedProcessingAgentRecord>().First(p => p.Id == 1); 
//l.Language is null 

所以外鍵導航屬性不填充由於某種原因,我不知道爲什麼。 只有當我查詢派生實體時發生這種情況,在這種情況下LocalizedProcessingAgentRecord。 任何想法?

這裏的EF XML標記:http://dl.dropbox.com/u/3055964/ef.xml

回答

1

你應該明確地加載這個導航屬性。

db.ProcessingAgents.Include("Language").OfType().First(p => p.Id == 1) 

Include將導致急切的導航屬性加載。

+0

該死的,我應該對每一個查詢做同樣的事嗎?有沒有更好的方法來實現這一目標? :( – Davita 2010-06-30 07:01:24

+0

如果您使用的是ef v4.0,您可以啓用延遲加載ctx.ContextOptions.LazyLoadingEnable = true。 在ef v1.0中沒有透明延遲加載,但可以執行如下所示的明顯延遲加載: if( !agent.Language.IsLoaded) agent.Language.Load(); – 2010-06-30 08:07:57

+0

感謝yury,你的回答真的很有幫助 – Davita 2010-06-30 09:51:40