2010-04-21 5 views
12

Gegeben ein EntityType, wie "Kontakt", wie kann ich daraus den Namen des EntitySet ableiten, zu dem es gehören würde, d. H. Die Pluralisierung wie "Kontakte"?Holen Sie den EntitySet-Namen von einem EntityType in EF

+0

Ich vermute, Sie haben keine Instanz des Objekts? – Nix

+0

@Nix Ich hatte auch das gleiche Problem, mein Typ war T param, also gab es sicher keine Instanz des Objekts? –

+0

Ich muss kommentieren und danke dafür, weil ich in der gleichen Ausgabe von 'Kontakte' und 'Kontakt' lief – cost

Antwort

30

Wenn Sie bereits eine gebundene Einheit haben (natürlich müssen Sie nicht die erste Zeile, benutzen Sie einfach Ihre bestehende Einheit):

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

Oder wenn Sie dies nicht tun:

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

Sehr nett. Ich brauchte dies, um zusätzliche Anpassungen von POCO-Entitäten vorzunehmen, wie das Hinzufügen von GetById() -Methoden zu allen Entitätsklassen. –

+0

Genie, ich habe versucht, dies seit Ewigkeiten zu tun, vielen Dank, +1 für eine gute Antwort –

+0

Beachten Sie, dass CSpace Abfragen nur funktionieren, wenn Sie mit der Datenbank verbunden sind, so dass es in Szenarien nicht funktioniert, wo Sie gerade möchte Typen direkt abfragen. –

6

01: diese Erweiterung kann

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

und es verwenden, wie nützlich sein

db.AttachTo(db.GetEntitySetName<MyEntityType>(), myEntityInstance); 
Verwandte Themen