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

Entity framework 4 实体框架:如何获取TPT或TPH实体的EntitySetName,entity-framework-4,Entity Framework 4,我有一个从资源实体(Employee->Person->Resource)继承的Person实体继承的Employee实体。是否可以通过编程方式获取员工的EntitySetName(应该是Resources)?我从这里举个例子 。。。在代码片断中只考虑 Outs/Cux>实例(因此,我们没有一个带有密钥的实体实例): //我已经用EF 4.1/DbContext进行了测试,对于EF 4.0,忘记这一行吧 var objectContext=((IObjectContextAdapter)dbC

我有一个从资源实体(Employee->Person->Resource)继承的Person实体继承的Employee实体。是否可以通过编程方式获取员工的EntitySetName(应该是Resources)?

我从这里举个例子

。。。在代码片断中只考虑<代码> Outs/Cux>实例(因此,我们没有一个带有密钥的实体实例):

//我已经用EF 4.1/DbContext进行了测试,对于EF 4.0,忘记这一行吧
var objectContext=((IObjectContextAdapter)dbContext).objectContext;
类型entityType=typeof(员工);
字符串entityTypeName=entityType.Name;
var container=objectContext.MetadataWorkspace.GetEntityContainer(
objectContext.DefaultContainerName、DataSpace.CSpace);
字符串entitySetName=(来自container.BaseEntitySets中的meta)
其中meta.ElementType.Name==entityTypeName
选择meta.Name).First();
字符串fullEntitySetName=container.Name+“+entitySetName;
现在的问题是,此代码在
First()
中引发异常,因为没有元素类型名称等于“Employee”的
BaseEntitySet
。显然,因为model=“Resource”中只有一个基类型的集合

一种可能的修复方法是将上面的第二行和第三行更改为:

Type entityType=typeof(员工);
while(entityType.BaseType.Name!=“对象”)
entityType=entityType.BaseType;
字符串entityTypeName=entityType.Name;
如果,则应将“资源”返回为
entitySetName

  • 您的实体不是从
    EntityObject
    派生的(在这种情况下,如果在
    中用上面的
    循环中的“EntityObject”替换“Object”,则可能会起作用)
  • 实体不是从另一个自定义类型派生的,该自定义类型不是模型中的实体。例如,如果您拥有从基本类型
    MyBaseObject
    派生的
    Resource
    ,但没有将其包含在模型中(没有
    DbSet
    ObjectSet
    ),则必须在
    while
    循环中将“Object”替换为“MyBaseObject”
第二个限制不是很好,因为您的实体类中可能有不同的非模型基类型,这会使上面的代码不太通用


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

这可能值得一试:@Slauma:这是一个答案;)它适用于除继承实体以外的所有对象。继承的实体不会显示在BaseEntities列表中。不错的尝试:)@Ladislav:当我将此作为答案发布时,我如何确保谷歌获得了可能的声誉,而不是我:)但好吧,你强迫。。。嗯。。。鼓励(;)我现在详细地测试这个,而派生类型实际上有一个问题,请参阅我的答案。while循环做到了!非常感谢你的回答!也为我工作,我正在使用EF1。必须使用“EntityObject”而不是object。此外,专用类中的导航属性不能与linq查询联接。但是,如果从另一个对象开始,然后包含专用类,则仍然可以进行连接。您必须在正确的方向上导航关系(仅单向)。