2011-10-11 72 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查询结合使用。如果你从另一个对象开始,然后包含专门的类,你仍然可以进行连接。您必须以正确的方向导航关系(仅限一种方式)。 –