In caso aiuta nessuno, avevo bisogno di essere in grado di fare questo senza la conoscenza del tipo di anticipo (quindi non ho potuto fare facilmente CreateObjectSet<YourEntity>()
perché non sapevo YourEntity
), quindi ero in grado di adattarsi @Ladislav 's soluzione nella seguente:
// 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;
Sembra un po' strano che MetadataWorkspace.GetType
richiede stringhe del nome del tipo e dello spazio dei nomi, invece di uno System.Type, ma questo è il migliore che ho trovato.
fonte
2014-08-20 10:01:01
Thx. contrassegnato come risposta. Mi piace lasciare un commento, che è una migliore idea di aggiungere un'interfaccia per la classe di contesto (ad esempio, IYourDataContext) ed ereditare l'IObjectContextAdapter a quella IYourDataContext. In questo modo non devi lanciarlo. –
Dato che ora è 5 anni, c'è un modo per farlo senza un pesante riflesso? Il contesto della mia domanda è un tentativo di implementare un metodo di ricerca senza tracciamento, come SingleOrDefault() ma in una classe base che non può presumere di conoscere il nome della chiave dell'entità. Grazie ragazzi. –
Grazie mille, il lavoro come un fascino –