我发现下面的代码使用方法找出给定实体类类型的实体的表名GetTableName
。但是GetEntitySet
方法失败了,因为在 TPH 中的表名,因此看起来 EntitySetBase 与子类型不同。"Entity type not found in GetTableName"
它从第throw
15 行的语句中抛出带有 message 的异常。
如果我有一个基类A
和一个派生类B
,如何找出 B 类型对应的 EntitySetBase 对象?(它应该给我与 A 相关的 EntitySetBase,以便我可以找出表中的记录[dbo].[As]
。)
private static Dictionary<Type, EntitySetBase> _mappingCache =
new Dictionary<Type, EntitySetBase>();
private EntitySetBase GetEntitySet(Type type) {
if (!_mappingCache.ContainsKey(type)) {
ObjectContext octx = ((IObjectContextAdapter) this).ObjectContext;
string typeName = ObjectContext.GetObjectType(type).Name;
var es = octx.MetadataWorkspace
.GetItemCollection(DataSpace.SSpace)
.GetItems<EntityContainer>()
.SelectMany(c => c.BaseEntitySets
.Where(e => e.Name == typeName))
.FirstOrDefault();
if (es == null)
throw new ArgumentException("Entity type not found in GetTableName", typeName);
_mappingCache.Add(type, es);
}
return _mappingCache[type];
}
private string GetTableName(Type type) {
EntitySetBase es = GetEntitySet(type);
return string.Format("[{0}].[{1}]",
es.MetadataProperties["Schema"].Value,
es.MetadataProperties["Table"].Value);
}