2011-10-11 76 views
2

我有一個Employee實體,它從繼承自Resource實體(Employee - > Person - > Resource)的Person實體繼承。是否可以通過編程獲取Employee的EntitySetName(應該是Resources)?實體框架:如何獲得TPT或TPH實體的EntitySetName

+0

這可能值得一試:http://msmvps.com/blogs/kevinmcneish/archive/2009/12/03/entity-framework-programmatically-determining-the-entity-set-name-of-an- entity.aspx – Slauma

+0

@Slauma:這是一個答案;) –

+0

它適用於一切,但繼承實體。繼承的實體不顯示在BaseEntities列表中。好嘗試雖然:) –

回答

3

我將這個例子從這裏...

http://msmvps.com/blogs/kevinmcneish/archive/2009/12/03/entity-framework-programmatically-determining-the-entity-set-name-of-an-entity.aspx

...,只考慮在代碼段的else情況下(因此,我們沒有實體實例用鑰匙):

// I have tested with EF 4.1/DbContext, for EF 4.0 forget this line 
var objectContext = ((IObjectContextAdapter)dbContext).ObjectContext; 

Type entityType = typeof(Employee); 
string entityTypeName = entityType.Name; 

var container = objectContext.MetadataWorkspace.GetEntityContainer(
    objectContext.DefaultContainerName, DataSpace.CSpace); 
string entitySetName = (from meta in container.BaseEntitySets 
         where meta.ElementType.Name == entityTypeName 
         select meta.Name).First(); 
string fullEntitySetName = container.Name + "." + entitySetName; 

現在的問題是,這個代碼引發異常的First()因爲沒有BaseEntitySet與元素類型名稱等於「僱員」。很明顯,因爲model =「Resource」中只有一個基類型的集合。

一個可能的解決方法是改變上述第二和第三個行:

Type entityType = typeof(Employee); 
while (entityType.BaseType.Name != "Object") 
    entityType = entityType.BaseType; 
string entityTypeName = entityType.Name; 

這應該歸還的「資源」爲entitySetNameIF ...

  • 你的實體不是從EntityObject派生的(在這種情況下,如果在上面的while循環中將「Object」替換爲「EntityObject」,則可能會起作用)
  • 您的實體不是從另一個不是模型中的實體的自定義類型派生的。例如,如果您有Resource派生自基類型MyBaseObject但未包含在模型中(沒有DbSet<MyBaseObject>或​​),則必須用while循環中的「MyBaseObject」替換「Object」。

第二個限制是不好的,因爲你的實體類中可能有不同的非模型基類型,這會使得上面的代碼不是非常普遍適用的。

也許有更聰明的方法直接從MetadataWorkspace獲得模型基類型,但我不知道。

+0

while循環做到了!非常感謝你的回答! –

+0

也爲我工作,我使用EF1。必須使用「EntityObject」而不是對象。另外,專用類中的導航屬性不能與linq查詢結合使用。如果你從另一個對象開始,然後包含專門的類,你仍然可以進行連接。您必須以正確的方向導航關係(僅限一種方式)。 –