5 dic 2010

Entity Framework 4 - Cómo obtener un objeto por su primary key

Implementando mi patrón Repository, me encontré con un problema al tratar de hacer un método del estilo GetObjectById(int id), que básicamente devolvería un objeto a partir de su clave primaria en la base de datos.
Por más que revisé toda la web, no encontré la solución, así que luego de estar un largo rato probando voy a plasmar aquí la forma de resolverlo.
Básicamente lo que hago es un método donde le paso un array de objects, ya que la clave primaria en la BD puede estar formada por varios campos, donde cada elemento es una clave.
Aquí el método en cuestión:


public T GetEntityById(params object[] keys)
{
using (SampleDBEntities context = new SampleDBEntities(SampleDBEntities.ConnectionString))
{
EntitySet en = context.CreateObjectSet<T>().EntitySet;
EntityKeyMember[] entityKeys = new EntityKeyMember[en.ElementType.KeyMembers.Count];

for(int i=0;i < en.ElementType.KeyMembers.Count;i++)
{
entityKeys[i] = new EntityKeyMember();
entityKeys[i].Key = en.ElementType.KeyMembers[i].Name;
entityKeys[i].Value = keys[i];
}

EntityKey entityKey = new System.Data.EntityKey { EntityContainerName = en.EntityContainer.Name, EntityKeyValues = entityKeys, EntitySetName = en.Name };
object outObject = null;

context.TryGetObjectByKey(entityKey, out outObject);

return (T)outObject;
}
}



Luego desde un main podrían usarlo de la siguiente forma:


static void Main(string[] args)
{
//aquí uso Unity para resolver implementaciones
ICustomerRepository repo = ProxyGenerator.GetImplementation<ICustomerRepository>("CustomerMappging");

//obtengo el cliente por su primary key

Customer customer = repo.GetCustomerById(1);
}


Espero que haya sido útil.
Saludos,
Mike

2 comentarios:

  1. Gracias!, me fue muy útil, gracias a tú código pude entender muchas cosas, aunque la implementación que hice fue mucho menos sofisticada que la tuya, jeje, saludos!

    ResponderEliminar
  2. Bueno me alegro mucho :) cualquier consulta que te pueda ayudar aquí estoy! saludos!

    ResponderEliminar