实体框架-从实体中获取表名称

本文关键字:实体 获取 框架 | 更新日期: 2023-09-27 17:57:35

我使用的是带有代码优先方法的实体框架4.1。我可以获得我的实体的存储模型类型和列名:

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])。

有什么通用的方法可以获得这些信息吗?

实体框架-从实体中获取表名称

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