1

GetTableNameメソッドを使用して、指定されたエンティティ クラス タイプのエンティティのテーブル名を調べるコードを見つけました。ただしGetEntitySet、TPH ではテーブル名、したがって一見 EntitySetBase がサブタイプとは異なるため、メソッドは失敗します。15 行目のステートメント"Entity type not found in GetTableName"からmessage で例外をスローします。throw

基本クラスAと派生クラスがある場合B、どの EntitySetBase オブジェクトがタイプ B に対応しているかを調べるにはどうすればよいですか? (レコードが table にあることを確認できるように、 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