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);
}