2010-04-21 15 views
12

Dado un EntityType, como "Contacto", ¿cómo puedo derivar de él el nombre del EntitySet al que pertenecería, es decir, la pluralización como "Contactos"?Obtener el nombre EntitySet de un EntityType en EF

+0

Supongo que no tienes una instancia del objeto? – Nix

+0

@Nix También tuve el mismo problema, mi Type era T param, ¿por lo que no había ninguna instancia del objeto? –

+0

Tengo que comentar y gracias por esto, porque me encontré con el mismo problema EXACTO de 'Contactos' y 'Contacto' – cost

Respuesta

30

Si ya tiene una entidad adscrita (obviamente no es necesario la primera línea, sólo tiene que utilizar su entidad existente):

Contact c = context.Contacts.Where(x => x.blah).FirstOrDefault(); 
    string setName = c.EntityKey.EntitySetName; 

O si no lo hace:

string className = typeof(Contact).Name 
var container = 
    context.MetadataWorkspace.GetEntityContainer(context.DefaultContainerName, DataSpace.CSpace); 
    string setName = (from meta in container.BaseEntitySets 
              where meta.ElementType.Name == className 
              select meta.Name).First(); 
+0

Muy bien. Necesitaba esto para realizar personalizaciones adicionales de entidades POCO, como agregar métodos GetById() a todas las clases de entidad. –

+0

Genius, he estado tratando de hacer esto por años, muchas gracias, +1 por una excelente respuesta –

+0

Tenga en cuenta que las consultas de CSpace solo funcionan cuando se ha conectado a la base de datos, por lo que no funcionarán en escenarios en los que solo quiere consultar tipos directamente –

6

esta extensión puede ser útil

public static class MyExtensions 
{ 
    public static string GetEntitySetName<T>(this ObjectContext context) 
    { 
     string className = typeof(T).Name; 

     var container = context.MetadataWorkspace.GetEntityContainer(context.DefaultContainerName, DataSpace.CSpace); 
     string entitySetName = (from meta in container.BaseEntitySets 
           where meta.ElementType.Name == className 
           select meta.Name).First(); 

     return entitySetName; 
    } 
} 

y utilizarlo como:

db.AttachTo(db.GetEntitySetName<MyEntityType>(), myEntityInstance); 
Cuestiones relacionadas