1

我发现下面的代码使用方法找出给定实体类类型的实体的表名GetTableName。但是GetEntitySet方法失败了,因为在 TPH 中的表名,因此看起来 EntitySetBase 与子类型不同。"Entity type not found in GetTableName"它从第throw15 行的语句中抛出带有 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);
    }
4

0 回答 0