我有一个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. TPT映射实体框架CTP4表现得像TPH
- 2. C#,实体框架,TPH
- 3. 实体框架继承:TPT,TPH还是none?
- 4. 如何获得的LINQ /实体框架
- 5. 实体框架TPT继承 - 如何从数据库中获取?
- 6. 实体框架4:通用存储库:如何确定EntitySetName?
- 7. 实体框架ctp5得到unproxied实体
- 8. 实体框架 - 如何通过实体
- 9. 实体框架:如何在实体
- 10. 实体框架或NHibernate的
- 11. 如何在实体框架中保存派生类型(TPT)?
- 12. 实体框架6 TPT,父实体上的同一类型的多个集合
- 13. 实体框架实体json
- 14. 从实体框架中的父实体获取子实体c#
- 15. 如何获取实体框架中插入实体的ID?
- 16. 后获得数评论实体框架
- 17. 实体框架4或DataSet?
- 18. 阻止实体框架序列化EntityKey,EntitySetName等
- 19. 实体框架
- 20. 实体框架
- 21. 实体框架
- 22. 实体框架
- 23. 实体框架4.0:如何
- 24. 如何在实体框架
- 25. 如何与实体框架
- 26. 如何从实体框架
- 27. 实体框架 - 如何获取列?
- 28. 如何在TPH TPT对象之间映射外键 - 实体框架代码第一个
- 29. 实体框架:当实体ID的SaveChanges
- 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列表中。好尝试虽然:) –