我有一個Employee實體,它從繼承自Resource實體(Employee - > Person - > Resource)的Person實體繼承。是否可以通過編程獲取Employee的EntitySetName(應該是Resources)?實體框架:如何獲得TPT或TPH實體的EntitySetName
回答
我將這個例子從這裏...
...,只考慮在代碼段的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;
這應該歸還的「資源」爲entitySetName
IF ...
- 你的實體不是從
EntityObject
派生的(在這種情況下,如果在上面的while
循環中將「Object」替換爲「EntityObject」,則可能會起作用) - 您的實體不是從另一個不是模型中的實體的自定義類型派生的。例如,如果您有
Resource
派生自基類型MyBaseObject
但未包含在模型中(沒有DbSet<MyBaseObject>
或),則必須用while
循環中的「MyBaseObject」替換「Object」。
第二個限制是不好的,因爲你的實體類中可能有不同的非模型基類型,這會使得上面的代碼不是非常普遍適用的。
也許有更聰明的方法直接從MetadataWorkspace
獲得模型基類型,但我不知道。
while循環做到了!非常感謝你的回答! –
也爲我工作,我使用EF1。必須使用「EntityObject」而不是對象。另外,專用類中的導航屬性不能與linq查詢結合使用。如果你從另一個對象開始,然後包含專門的類,你仍然可以進行連接。您必須以正確的方向導航關係(僅限一種方式)。 –
- 1. 實體框架TPH上TPT
- 2. TPT映射實體框架CTP4表現得像TPH
- 3. C#,實體框架,TPH
- 4. 實體框架繼承:TPT,TPH還是none?
- 5. 實體框架代碼首先轉換TPT到TPH
- 6. 如何獲得的LINQ /實體框架
- 7. 獲得在實體框架
- 8. 實體框架繼承映射(TPH)
- 9. 實體框架6.1鑑別TPH
- 10. 實體框架TPH繼承錯誤:
- 11. 實體框架一對多映射TPH
- 12. 實體框架TPT繼承 - 如何從數據庫中獲取?
- 13. 如何僅使用實體框架屬性實現TPH映射
- 14. 實體框架4:通用存儲庫:如何確定EntitySetName?
- 15. 實體框架ctp5得到unproxied實體
- 16. 實體框架 - 如何通過實體
- 17. 實體框架:如何在實體
- 18. 實體框架:獲取相關實體
- 19. 實體框架或NHibernate的
- 20. 實體框架:實體
- 21. 實體框架實體
- 22. 實體框架實體json
- 23. 如何在實體框架中保存派生類型(TPT)?
- 24. 實體框架6 TPT,父實體上的同一類型的多個集合
- 25. 從實體框架中的父實體獲取子實體c#
- 26. 實體框架獲取具有子實體的實體
- 27. 得到實體框架
- 28. 阻止實體框架序列化EntityKey,EntitySetName等
- 29. 如何獲取實體框架中插入實體的ID?
- 30. 無法獲得實體框架連接
這可能值得一試:http://msmvps.com/blogs/kevinmcneish/archive/2009/12/03/entity-framework-programmatically-determining-the-entity-set-name-of-an- entity.aspx – Slauma
@Slauma:這是一個答案;) –
它適用於一切,但繼承實體。繼承的實體不顯示在BaseEntities列表中。好嘗試雖然:) –