¿Cómo puedo llamar a un procedimiento almacenado de SQL utilizando EntityFramework 7 y Asp.Net 5?

asp.net-core-mvc c# ef-database-first entity-framework-core sql-server

Pregunta

Durante los últimos dos días, estoy buscando algunos tutoriales sobre cómo llamar a un Stored Procedure desde un método de controlador de Web API utilizando EntityFramework 7 .

Todos los tutoriales a los que llegué lo muestran al revés, es decir Code First enfoque de Code First . Pero ya tengo una base de datos y necesito usarla para crear una Web API . Varias lógicas de negocios ya están escritas como Procedimientos y vistas almacenadas y tengo que consumirlas de mi API web.

Pregunta 1: ¿Es posible continuar con el enfoque de Database First con EF7 y consumir objetos de base de datos como arriba?

Instalé EntityFramework 6.1.3 en mi paquete con el siguiente comando de NuGet :

install-package EntityFramework que agrega la versión 6.1.3 a mi proyecto pero inmediatamente comienza a mostrarme un mensaje de error (consulte la captura de pantalla a continuación). No tengo ni idea de cómo resolver esto.

introduzca la descripción de la imagen aquí

Tengo otro proyecto de prueba donde en project.json puedo ver dos entradas como las siguientes:

"EntityFramework.MicrosoftSqlServer": "7.0.0-rc1-final", "EntityFramework.MicrosoftSqlServer.Design": "7.0.0-rc1-final",

Sin embargo, cuando busco en Nu-Get package manager, ¡no veo esta versión! Sólo 6.1.3 está subiendo.

Mi objetivo principal es consumir procedimientos almacenados y vistas ya escritos de una base de datos existente.

1) No quiero usar ADO.Net , más bien me gustaría usar ORM usando EntityFramework

2) Si EntityFramework 6.1.3 tiene la capacidad de llamar Stored Procs y Views Stored Procs desde una base de datos ya existente, ¿cómo puedo resolver el error (captura de pantalla)?

¿Cuál es la mejor práctica para lograr esto?

Respuesta aceptada

Espero que entienda correctamente su problema. Tiene un PROCEDIMIENTO ALMACENADO existente, por ejemplo dbo.spGetSomeData , en la base de datos, que devuelve la lista de algunos elementos con algunos campos y necesita proporcionar los datos del método de API web.

La implementación podría ser sobre lo siguiente. Puede definir un DbContext vacío como:

public class MyDbContext : DbContext
{
}

y para definir appsettings.json con la cadena de conexión a la base de datos

public class MyDbContext : DbContext
{
}

Debe usar Microsoft.Extensions.DependencyInjection para agregar MyDbContext a la

public class MyDbContext : DbContext
{
}

Ahora puedes implementar tu acción de WebApi de la siguiente manera:

public class MyDbContext : DbContext
{
}

El código anterior solo se ejecuta utilizando exec dbo.spGetSomeData y usa dataRader para leer todos los resultados y guardarlos en dynamic objeto dynamic . Si realizas $.ajax llamada $.ajax desde api/My obtendrás los datos devueltos desde dbo.spGetSomeData , que puedes usar directamente en el código JavaScript. El código anterior es muy transparente. Los nombres de los campos del conjunto de datos que devuelve dbo.spGetSomeData serán los nombres de las propiedades en el código JavaScript. No necesita administrar ninguna clase de entidad en su código C # de ninguna manera. Su código C # no tiene nombres de campos devueltos por el procedimiento almacenado. Por lo tanto, si desea extender / cambiar el código de dbo.spGetSomeData (renombrar algunos campos, agregar nuevos campos) necesitará ajustar solo su código JavaScript, pero no el código C #.


Respuesta popular

DbContext tiene una propiedad de Database , que mantiene una conexión con la base de datos que puede hacer lo que quiera con:

context.Database.SqlQuery<Foo>("exec [dbo].[GetFoo] @Bar = {0}", bar);

Sin embargo, en lugar de hacer esto en sus acciones de Web Api, sugeriría agregar un método a su contexto o cualquier servicio / repositorio que interactúe con su contexto. Entonces solo llama a este método en tu acción. Idealmente, quieres mantener todas tus cosas de SQL en un solo lugar.




Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué