Así que me dio este trabajo, esto es lo que tengo:
internal SomeInternalPOCOWrapper FindXXX(string xxx)
{
Condition.Requires(xxx).IsNotNullOrEmpty();
var someInternalPokey = new SomeInternalPOCOWrapper();
var ctx = (this as IObjectContextAdapter).ObjectContext;
var con = new SqlConnection("xxxxx");
{
con.Open();
DbCommand cmd = con.CreateCommand();
cmd.CommandText = "exec dbo.usp_XXX @xxxx";
cmd.Parameters.Add(new SqlParameter("xxxx", xxx));
using (var rdr = cmd.ExecuteReader())
{
// -- RESULT SET #1
someInternalPokey.Prop1 = ctx.Translate<InternalPoco1>(rdr);
// -- RESULT SET #2
rdr.NextResult();
someInternalPokey.Prop2 = ctx.Translate<InternalPoco2>(rdr);
// -- RESULT SET #3
rdr.NextResult();
someInternalPokey.Prop3 = ctx.Translate<InternalPoco3>(rdr);
// RESULT SET #4
rdr.NextResult();
someInternalPokey.Prop4 = ctx.Translate<InternalPoco4>(rdr);
}
con.Close();
}
return someInternalPokey;
}
Esencialmente, es básicamente como ADO.NET clásico. Leyó el DbReader
, avanzó al siguiente conjunto de resultados, etc.
Pero al menos tenemos el método Translate
que aparentemente se mueve de izquierda a derecha entre los campos del conjunto de resultados y la entidad suministrada.
Tenga en cuenta que el método es interno.
Mi Repositorio llama a este método, luego hidrata el DTO en mis objetos de dominio.
no estoy 100% contento con él por 3 razones:
- Tenemos a emitir el
DbContext
como IObjectContextAdapter
. El método Translate
debe estar en DbContext<T>
clase IMO.
- Tenemos que usar objetos clásicos de ADO.NET. ¿Por qué? Los procedimientos almacenados son deben tener para cualquier ORM. Mi principal queja con EF es la falta del soporte de procedimientos almacenados y esto parece no haber sido rectificado con EF CTP5.
- Tienes que abrir una nueva conexión Sql. ¿Por qué no puede usar la misma conexión que abrió el Contexto EF?
Espero que esto ayude a alguien y envíe un mensaje al equipo de EF. Necesitamos compatibilidad de resultados múltiples para SPROCS fuera de la plataforma. Puede asignar un proceso almacenado a un tipo complejo, entonces ¿por qué no podemos mapear un proceso almacenado a múltiples tipos complejos?
Nadie tiene nada? = ( – RPM1984