Entity framework 4 实体框架:如何获取TPT或TPH实体的EntitySetName
我有一个从资源实体(Employee->Person->Resource)继承的Person实体继承的Employee实体。是否可以通过编程方式获取员工的EntitySetName(应该是Resources)?我从这里举个例子 。。。在代码片断中只考虑<代码> Outs/Cux>实例(因此,我们没有一个带有密钥的实体实例):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
//我已经用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
循环中将“Object”替换为“MyBaseObject”while
也许有一种更聪明的方法可以直接从
MetadataWorkspace
获取模型基类型,但我不知道。这可能值得一试:@Slauma:这是一个答案;)它适用于除继承实体以外的所有对象。继承的实体不会显示在BaseEntities列表中。不错的尝试:)@Ladislav:当我将此作为答案发布时,我如何确保谷歌获得了可能的声誉,而不是我:)但好吧,你强迫。。。嗯。。。鼓励(;)我现在详细地测试这个,而派生类型实际上有一个问题,请参阅我的答案。while循环做到了!非常感谢你的回答!也为我工作,我正在使用EF1。必须使用“EntityObject”而不是object。此外,专用类中的导航属性不能与linq查询联接。但是,如果从另一个对象开始,然后包含专用类,则仍然可以进行连接。您必须在正确的方向上导航关系(仅单向)。