Entity Framework GetByID genérico simples mas tem diferentes nomes PK

Alguns corpos podem me ajudar a criar um método GetByID genérico. O desafio aqui é que eu tenho muitas entidades, cada uma delas tem um nome PK diferente.

Eu vejo vários exemplos com um GetByID genérico, mas muitos deles tem o mesmo nome de PK como (id).

Obrigado.

Aqui está um exemplo de class de repository base para a construção de repositorys para entidade com chave de propriedade única. O método GetByKey é independente do nome ou tipo da chave.

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

Há um trickler ao usar este código. Se você não usar a class gerada derivada do ObjectContext e usar o ObjectContext diretamente, deverá definir manualmente o DefaultContainerName usado pelo seu modelo.

Editar:

Este método é para o EF clássico. Eu posso pensar em versão para Code-first, se necessário.

Eu sei que esta resposta é antiga e especificamente marcada como EF-4, mas Find () ou FindAsync () são a solução correta a partir do EF-6 fwiw:

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