Entity Framework - Получить имя таблицы от Entity
Я использую Entity Framework 4.1 с подходом Code First. Я могу получить типы моделей хранения и имена столбцов моих сущностей:
var items = context.ObjectContext.MetadataWorkspace.GetItems<EntityType>(DataSpace.SSpace);
foreach (var i in items)
{
Console.WriteLine("Table Name: {0}", i.Name);
Console.WriteLine("Keys:");
foreach (var key in i.KeyMembers)
Console.WriteLine("\t{0} ({1})", key.Name, key.TypeUsage.EdmType.FullName);
Console.WriteLine("Members:");
foreach (var member in i.Members)
Console.WriteLine("\t{0} ({1})", member.Name, member.TypeUsage.EdmType.FullName);
}
Что мне нужно, это получить реальное имя таблицы, на которую отображается объект. Есть разные способы указать это (используя Fluent-API .ToTable(), DataAnnotation [TableAttribute]).
Есть ли какой-нибудь общий способ получить эту информацию?
3 ответа
EF 6.1, сначала код:
public static string GetTableName<T>(this DbContext context) where T : class
{
ObjectContext objectContext = ((IObjectContextAdapter)context).ObjectContext;
return objectContext.GetTableName(typeof(T));
}
public static string GetTableName(this DbContext context, Type t)
{
ObjectContext objectContext = ((IObjectContextAdapter)context).ObjectContext;
return objectContext.GetTableName(t);
}
private static readonly Dictionary<Type,string> TableNames = new Dictionary<Type, string>();
public static string GetTableName(this ObjectContext context, Type t)
{
string result;
if (!TableNames.TryGetValue(t, out result))
{
lock (TableNames)
{
if (!TableNames.TryGetValue(t, out result))
{
string entityName = t.Name;
ReadOnlyCollection<EntityContainerMapping> storageMetadata = context.MetadataWorkspace.GetItems<EntityContainerMapping>(DataSpace.CSSpace);
foreach (EntityContainerMapping ecm in storageMetadata)
{
EntitySet entitySet;
if (ecm.StoreEntityContainer.TryGetEntitySetByName(entityName, true, out entitySet))
{
result = entitySet.Schema + "." + entitySet.Table;//TODO: brackets
break;
}
}
TableNames.Add(t,result);
}
}
}
return result;
}
Я нашел самый простой способ получить имена таблиц:
var tables = Context.MetadataWorkspace.GetItems(System.Data.Metadata.Edm.DataSpace.CSpace)
.Where(x => (x.MetadataProperties.Contains("NamespaceName") ? String.Compare(x.MetadataProperties["NamespaceName"].Value.ToString(), "Model", true) == 0 : false)
&& !x.MetadataProperties.Contains("IsForeignKey")
&& x.MetadataProperties.Contains("KeyMembers"));
Это даст вам таблицу сущностей.
Затем вы можете сделать следующее, чтобы извлечь имя:
foreach (var item in tables)
{
EntityType itemType = (EntityType)item;
String TableName = itemType.Name;
}
Обратите внимание, если вы используете множественный контекст, вам нужно будет отменить это.
Есть другой способ получить имя таблицы EDM
public static string GetTableName<T>(this ObjectContext context) where T : EntityObject
{
var entities= context.MetadataWorkspace.GetItems(System.Data.Metadata.Edm.DataSpace.CSpace).Where(b => b.BuiltInTypeKind == BuiltInTypeKind.EntityType);
foreach (System.Data.Metadata.Edm.EntityType item in entities)
{
if(item.FullName==typeof(T).FullName)
return item.Name;
}
return String.Empty;
}