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
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!
ResponderEliminarBueno me alegro mucho :) cualquier consulta que te pueda ayudar aquí estoy! saludos!
ResponderEliminar