实体框架:如何获取TPT或TPH实体的EntitySetName

时间:2011-10-11 21:30:46

标签: entity-framework-4

我有一个Employee实体,它继承自一个继承自Resource实体的Person实体(Employee - > Person - > Resource)。是否有可能以编程方式获取Employee的EntitySetName(应该是Resources)?

1 个答案:

答案 0 :(得分: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元素类型名称等于“Employee”。显然,因为model =“Resource”中只有一个基本类型的集合。

可能的解决方法是将上面的第二行和第三行更改为:

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

这应该将“资源”作为entitySetName IF ...

返回
  • 您的实体不是来自EntityObject(在这种情况下,如果您在上面的while循环中将“对象”替换为“EntityObject”,它可能会有效)
  • 您的实体不是从另一个不是模型中的实体的自定义类型派生的。例如,如果您从基本类型Resource派生MyBaseObject但未将其包含在模型中(没有DbSet<MyBaseObject>ObjectSet<MyBaseObject>),那么您必须将{Object}替换为while循环中的“MyBaseObject”。

第二个限制并不好,因为你的实体类中可能有不同的非模型基类型,这会使上面的代码不是很普遍适用。

也许有一种更聪明的方法可以直接从MetadataWorkspace获取模型基类型,但我不知道。