2011-05-24 8 views
7

Estoy usando Entity Framework 4.1 con el enfoque Code First. Soy capaz de obtener los tipos de modelo de almacenamiento y nombres de las columnas de mis entidades:Entity Framework - Obtener el nombre de la tabla de la Entidad

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

Lo que necesito es conseguir que el nombre de la tabla de verdad la entidad está asignado. Hay diferentes formas de especificar eso (mediante el uso de Fluent-API .ToTable(), DataAnnotation [TableAttribute]).

¿Hay alguna forma común de obtener esta información?

Respuesta

10

La manera más fácil que he encontrado para obtener los nombres de tabla es la siguiente:

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

que les permite conocer las entidades de mesa.

A continuación, puede hacer lo siguiente para extraer el nombre:

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

Nota si su pluralizar el contexto que necesitará para deshacer eso.

1

Hay una otra manera se puede obtener el nombre de EDM Tabla

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

esto no funciona, ya que no devuelve el nombre de esquema de la tabla – NinjaCross

9

EF 6.1, código primero:

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

Considere incluir cierta información sobre su respuesta, en lugar de solo publicar el código. Intentamos proporcionar no solo 'soluciones', sino también ayudar a las personas a aprender. Debe explicar qué sucedió en el código original, qué hizo de manera diferente y por qué funcionó su (s) cambio (s). –

+2

Pensé que comenzar con "EF 6.1, código primero" está bastante bien ... –

+0

No sé por qué, no funciona (para mí) usando db-first. Mira mi respuesta aquí. http://stackoverflow.com/a/32871720/382515 –

Cuestiones relacionadas