我有一个Employee实体,它继承自一个继承自Resource实体的Person实体(Employee - > Person - > Resource)。是否有可能以编程方式获取Employee的EntitySetName(应该是Resources)?
答案 0 :(得分:3)
我从这里举例......
...并且只考虑代码段中的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
获取模型基类型,但我不知道。