Entity Framework Semplice GetByID generico ma con diverso nome PK

Qualche corpo può aiutarmi a creare un metodo GetByID generico, La sfida qui è che ho molte quadro, ognuna di esse ha un nome PK diverso.

Vedo diversi esempi con un GetByID generico, ma molti di loro hanno lo stesso nome PK come (id).

Grazie.

Ecco un esempio di class di repository di base per i repository creati per entity framework con chiave di proprietà singola. Il metodo GetByKey è indipendente sul nome o sul tipo di chiave.

 using System; using System.Data; using System.Data.Metadata.Edm; using System.Data.Objects; using System.Linq; namespace EntityKeyTest { // Base repository class for entity with simple key public abstract class RepositoryBase where TEntity : class { private readonly string _entitySetName; private readonly string _keyName; protected ObjectContext Context { get; private set; } protected ObjectSet ObjectSet { get; private set; } protected RepositoryBase(ObjectContext context) { if (context == null) { throw new ArgumentNullException("context"); } Context = context; ObjectSet = context.CreateObjectSet(); // Get entity set for current entity type var entitySet = ObjectSet.EntitySet; // Build full name of entity set for current entity type _entitySetName = context.DefaultContainerName + "." + entitySet.Name; // Get name of the entity's key property _keyName = entitySet.ElementType.KeyMembers.Single().Name; } public virtual TEntity GetByKey(TKey key) { // Build entity key var entityKey = new EntityKey(_entitySetName, _keyName, key); // Query first current state manager and if entity is not found query database!!! return (TEntity)Context.GetObjectByKey(entityKey); } // Rest of repository implementation } } 

C’è un trickler quando si utilizza questo codice. Se non si utilizza la class generata derivata da ObjectContext e si utilizza ObjectContext direttamente, è necessario impostare manualmente DefaultContainerName utilizzato dal modello.

Modificare:

Questo metodo è per EF classico. Posso pensare alla versione per Code-first se necessario.

So che questa risposta è vecchia e specificatamente contrassegnata come EF-4, ma Find () o FindAsync () sono la soluzione corretta di EF-6:

https://msdn.microsoft.com/en-us/library/dn246936(v=vs.113).aspx