2010-04-21 9 views
12

Dato un EntityType, come "Contact", come posso ricavarne il nome del EntitySet a cui apparterrebbe, cioè la pluralizzazione come "Contacts"?Ottieni il nome EntitySet da EntityType in EF

+0

Immagino che tu non abbia un'istanza dell'oggetto? – Nix

+0

@Nix Avevo anche lo stesso problema, il mio tipo era param T, quindi non c'era nessuna istanza dell'oggetto? –

+0

Devo commentare e ringraziare per questo, perché mi sono imbattuto nello stesso numero ESATTO di "Contatti" e "Contatti" – cost

risposta

30

Se si dispone già di un soggetto annesso (ovviamente non è necessario la prima linea, basta usare l'un'entità esistente):

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

O se non lo fai:

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

Molto bello. Avevo bisogno di questo per personalizzare ulteriormente le entità POCO, come aggiungere metodi GetById() a tutte le classi di entità. –

+0

Genius, ho cercato di farlo per anni, grazie mille, +1 per un'ottima risposta –

+0

Nota che le query di CSpace funzionano solo quando sei connesso al database, quindi non funzionerà in scenari in cui hai solo vuoi interrogare i tipi direttamente. –

6

questa estensione può essere utile

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

e usarlo come:

db.AttachTo(db.GetEntitySetName<MyEntityType>(), myEntityInstance); 
Problemi correlati