2012-07-21 55 views
1

我有一個TypeId列的外鍵,它是類型表的外鍵的BaseTable。我通過使用每個層次模式的模板將其映射到實體框架模型中。實體框架TPT繼承 - 如何從數據庫中獲取?

現在我有一個BaseClass和兩個子類SubClass1SubClass2並使基類abstract

從我的一頁到第二頁,我得到一個ID(當然是BaseClass的ID),我想從數據庫中獲取該對象。

我將如何讓我的查詢?當然id來自一個子類。

例如,我可以這樣寫:

BaseClass object = provider.getfrombaseclassbyid(id); 

我可以做這樣的拳擊?如果可以,我怎麼知道什麼是對象是真的。這是一個Subclass1Subclass2?我怎麼知道它?

你能幫我,我該怎麼辦?

回答

0

我不知道,如果下面的回答你的問題,但你的確可以查詢上一組respresents抽象的實體:

BaseClass entity = context.BaseClasses.SingleOrDefault(b => b.Id == id); 

結果當然永遠不會BaseClass類型的,因爲沒有實例可以創建抽象類型。它將是SubClass1SubClass2類型(或null,如果具有該id的實體不存在)。實體框架可以通過查看鑑別器列的值(對於每層表(TPH)的實體)或通過從基表連接到派生表中來決定創建對象時使用的類型類型(用於每種類型的表(TPT)繼承)。

您可以通過檢查例如物化類型:

string typeName = entity.GetType().Name; // will be "Subclass1" or "Subclass2" 

或者:

if (entity is SubClass1) 
    // ... 
else if (entity is SubClass2) 
    // ... 

如果你事先知道要加載類型的實體SubClass1可以使用OfType<T>運營商:

SubClass1 entity = context.BaseClasses.OfType<SubClass1>() 
    .SingleOrDefault(b => b.Id == id); 

如果實體w ith給定id不是SubClass1而是SubClass2而不是此查詢的結果將是null。否則它保證是SubClass1