2011-06-08 15 views
8

que tienen dos procedimientos simples almacenados en SqlServer:Ejecución de procedimientos almacenados desde un DbContext

  • SetData(@id int, @data varchar(10))
  • GetData(@id int).

GetData actualmente devuelve un conjunto de resultados de una sola fila y una sola columna, pero podría cambiarlo para que sea una función adecuada si es necesario.

¿Cuál sería la mejor forma de ejecutar esto desde una instancia de DbContext?

De ser posible, me gustaría evitar tener que hacer mi propia gestión de estado de conexión y/o exponer tipos específicos de EF. Comencé recuperando el ObjectContext y mirando las funciones Execute*, pero la documentación es bastante mala y carece de ejemplos que impliquen procedimientos almacenados.

Idealmente, me gustaría ser capaz de hacer esto:

myContext.ExecuteNonQuery("SetData", id, data); 
var data = myContext.ExecuteScalar<string>("GetData", id); 

Respuesta

21

DbContext ofrece estas funciones. Uso:

IEumerable<...> result = myContext.Database.SqlQuery<...>(...) 

para ejecutar el procedimiento almacenado y recuperación de

int result = myContext.Database.ExecuteSqlCommand(...) 

para ejecutar procedimiento almacenado de modificación de datos.

+0

¿Qué hay de los parámetros? ¿Tengo que hacerlo como se especifica aquí o hay un atajo? http://stackoverflow.com/questions/4873607/how-to-use-dbcontext-database-sqlquerytelementsql-params-with-stored-procedu/4874600#4874600 –

+0

Esa es una manera. También debería funcionar sin usar 'SqlParameter', solo pasar valores. No estoy seguro si no tiene que referirse a ellos por @ p0, @ p1, etc. cuando usa valores directamente. –

+0

Terminé pasando un objeto anónimo y convirtiéndolo a SqlParameters internamente. –

Cuestiones relacionadas