Dentro del mundo del desarrollo de aplicaciones es casi una necesidad poder acceder a un repositorio de datos donde almacenar y consultar la información que se requiere en el negocio, y por tal razón existen varias formas de resolver esa situación.
El caso que voy a exponer a continuación es la utilización de las funciones "stored procedures" de Microsoft SQL Server a través de Entity Framework.
Al revisar la documentación existente, se puede decir que existen dos formas predominantes para hacer el llamado de "stored procedures" desde "Entity Framework".
- Agregar el "stored procedure" al EDM y utilizar la funcionalidad "Add Function Import" tal como se explica en este artículo.
- Hacer el llamado de los "stored procedures" bajo la estrategia "Entity Framework Code First" explicado en este artículo.
Hay mucho material sobre la discusión de usar Entity Framework Query y Direct raw SQL Execution, lo cual podemos ver en los siguientes enlaces:
https://www.mikesdotnetting.com/article/299/entity-framework-code-first-and-stored-procedures
http://www.binaryintellect.net/articles/30738a7c-5176-4333-aa83-98eab8548da5.aspx
En mi experiencia personal he usado los "stored procedures" para operaciones del tipo CRUD en escenarios como tablas maestros/detalles, en donde para generar los registros en la tabla de detalles necesitas previamente uno o varios valores del registro de la tabla maestra; todo esto bajo la estrategia de "Direct raw SQLExecution", ya que en el pasado al utilizar tratar de manejar el "stored procedure" en el EDM y utilizar la función de importación, te tenido que "ajustar" el "stored procedure" para que cuando Visual Studio ejecute la detección de los parámetros estos retornen unos valores "dummy" y así los pueda visualizar y utilizar en el entorno de desarrollo, lo cual es un trabajo adicional que no considero necesario. Parte de esta realidad que comento se puede leer en este enlace.
Dado esa situación, me inclino por el uso del Direct raw SQL Execution, en donde ya con una conexión establecida a la base de datos por Entity Framework, simplemente hago el llamado a un "stored procedure" para el envío y recepción de los parámetros de la función sin problemas, esto sin agregar código adicional que no se requiere.
A continuación indico los pasos para el uso de un "stored procedure" en una aplicación C# con Entity Framework. Aun cuando se realizó el esfuerzo de detallar este procedimiento, existe la precondición de que el lector tenga conocimientos previos en Visual Studio, C#, T-SQL y Server Server, etc. para poder entender el ejemplo.
Pasos | Imagen |
Procedemos a entrar a SQL Server Management Studio | |
El siguiente paso es conectarse a una instancia de SQL Server, ingresando nombre de servidor y "Login" y "Password" | |
Se crea una base de datos dentro de la instancia de SQL Server con la cual se va a trabajar | |
Creación de base de datos | |
Dentro de la base de datos recientemente creada, se procede a crear una nueva tabla con los campos a utilizar: Campo1 y Campo2 tal cual se muestra en la imagen |
|
Dentro de la misma base de datos se busca el item "Programmability" Y se procede a la creación de un "stored Procedure" que recibe y retorna parámetros. Los parámetros: @parametro1 y @parametro2 reciben información y el @parametro3 retorna información | |
Ahora procedemos a entrar a Visual Studio | |
Al entrar al Visual Studio selecionamos "New Project" | |
En Visual Studio creamos un proyecto ASP.NET MVC para poder realizar el ejemplo | |
Al crearse el proyecto de Visual Studio, se selecciona la carpeta Model y se marca click derecho, se elige la opción "AddèNew item" | |
Aparece una nueva pantalla en donde nos ubicamos en "ADO.NET Entity Model" para agregar la instancia de "Entity Framework" | |
Se crea una instancia Entity FrameWork para que sirva de entorno de trabajo para el llamado del "Stored Procedure" |
|
Se establecen los parámetros de conexión a la base de datos previamente creada. |
|
Una vez establecida la conexión a base de datos, se procede a seleccionar la tabla "Tabla1" la cual utilizaremos en este ejemplo. Se selecciona con el check box y se finaliza el proceso | |
Ya creada la instancia de Entity Framework, se procede a crear una clase controlador desde la sección de "Solution Explorer" del proyecto que estamos trabajando en Visual Studio | |
Se crea una clase "Controlador" de MVC para escribir el código para realizar el llamado al "Stored Procedure". En la sección de Model Class se selecciona la tabla agregada anteriormente al crear la instancia de Entity Framework. En la sección "Data context class" se selecciona el nombre del contexto creado al añadirla instancia de Entity Framework, que en este caso es: "BDPruebasEntities (MvcApplication1.Models)" | |
Al crear el controlador, se crea un archivo ."cs" donde están las distintas funciones nativas de una clase controlador MVC, las funciones ActionResult |
|
Se procede a crear un método privado el cual se puede llamar desde cualquier función del controlador.
| |
Se crea una función del tipo "ActionResult" para mostrar la forma que ejecutará el llamado al "Stored Procedure" | |
Luego se procede a crear una vista para esta función |
|
A la vista creada se le agrega un botón HTML del tipo "Submit", adicionalmente se incorpora la instrucción Html.BeginForm() para procesar el submit. | |
Luego se crea una función "ActionResult" para recibir el "Submit" generado desde la vista "Ejecución". En esta sección se hace el llamado a la función "CrearRegistro" mostrada anteriormente, la cual se encarga de enviar dos parámetros al "Stored Procedure" y recibe un parámetro de el. Se utiliza la instrucción ViewBag.Resultado para enviarle el valor del parámetro recibido a la vista que se llama desde esta función. | |
Se crea una vista siguiento el procedimiento anterior, en donde se muestra el resultado del parámetro devuelto por el "stored procedure" |
|
Ya con todos los pasos indicados, se procede a ejecutar la vista "Ejecucion" creada anteriormente, visualizamos la misma con el boton de "Submit", el cual se procede a marcar. | |
Este botón dispara el llamado a la función que envía y recibe parámetros del "Stored Procedure", mostrando como resultado la vista "resultado" con el valor de retorno del "Stored Procedure", en este caso el valor del campo ID, y en la tabla los valores de los parámetros al insertar el registro en la tabla. | |
Se definió una variable del tipo "SQLParameter" llamada "parametro3" la cual utilizo para recibir un parámetro desde el "stored procedure", y que al final asigno el valor de retorno a una variable local para su posterior utilización en el envío a una vista. En esta fase ese valor puede ser utilizado por el desarrollador para cubrir cualquier necesidad, como por ejemplo crear registros de en otra tabla que dependen del campo ID registrada en la tabla del ejemplo.
La instrucción "db.Database.ExecuteSqlCommand" permite realizar el llamado al "stored procedure" y se asignan los valores a los parámetros de entrada que se solicitan y la variable para recibir el valor de retorno.
Un punto importante en este secuencia de comandos, es la utilización del parámetro "TransactionalBehavior.DoNotEnsureTransaction" en la instrucción "ExecuteSQLCommand", el cual afecta el funcionamiento del "stored procedure" si se está manejando dentro de la función el concepto de transacciones ("BEGIN TRAN", "COMMIT TRAN","ROLLBACK TRANS ). Para mayor información consulte aquí.
Espero que este artículo les sea de utilidad, si quieren aprender más sobre desarrollo de aplicaciones, desarrollo en SharePoint o de SharePoint en general por favor visita nuestro site de Eigo Academy para conocer nuestra oferta de cursos.