Entity Framework - Get Table name from the Entity [duplicate]

[亡魂溺海] 提交于 2019-11-27 21:38:01

The Easiest way I have found to get table names is the following:

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

That will get you the table entities.

Then you can do the following to extract the name:

            foreach (var item in tables)
            {
                EntityType itemType = (EntityType)item;
                String TableName = itemType.Name;
            }

Note if your pluralizing the context you will need to undo that.

EF 6.1, code-first:

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

There is an other way you can get the EDM Table Name

  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;
    }
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!