W przypadku pomaga nikomu, muszę być w stanie to zrobić bez znając typ wcześniej (więc nie mogłem łatwo zrobić CreateObjectSet<YourEntity>()
bo nie wiem YourEntity
), więc byłem w stanie dostosować @Ladislav „s rozwiązanie na następujące:
// variable "type" is a System.Type passed in as a method parameter
ObjectContext objectContext = ((IObjectContextAdapter)this.context).ObjectContext;
IEnumerable<string> retval = (IEnumerable<string>)objectContext.MetadataWorkspace
.GetType(type.Name, type.Namespace, System.Data.Entity.Core.Metadata.Edm.DataSpace.CSpace)
.MetadataProperties
.Where(mp => mp.Name == "KeyMembers")
.First()
.Value;
Wydaje się trochę dziwne, że MetadataWorkspace.GetType
wymaga ciągi nazwą typu i nazw, zamiast System.Type, ale to najlepsze co mogłem znaleźć.
Thx. oznaczony jako odpowiedź. Chciałbym skomentować, że lepszym rozwiązaniem jest dodanie interfejsu do klasy kontekstu (np. IYourDataContext) i dziedziczenie IObjectContextAdapter do tego IYourDataContext. W ten sposób nie musisz go rzucać. –
Biorąc pod uwagę, że teraz jest 5 lat, czy istnieje sposób, aby to zrobić bez ciężkiej refleksji? Kontekstem mojego pytania jest próba implementacji metody Find bez śledzenia, takiej jak SingleOrDefault(), ale w klasie bazowej, która nie może zakładać, że zna nazwę klucza jednostki. Dzięki chłopaki. –
wielkie dzięki, działaj jak czar –