c# - stored - Procedimiento almacenado en el primer enfoque de la base de datos de Entity Framework
ejecutar stored procedure entity framework (2)
Estoy haciendo la transición para un proyecto de Webforms a la aplicación MVC utilizando el primer enfoque de la base de datos de Entity Framework y tengo la base de datos lista junto con todos los procedimientos almacenados en el lugar.
.edmx
exitosamente un archivo .edmx
y pude usar mis procedimientos almacenados y funcionó muy bien cuando hubo alguna operación de inserción o actualización para realizar. Pero el verdadero problema ocurrió cuando estaba usando la consulta de selección en uno de mis procedimientos almacenados.
Por ejemplo, hay una tabla Employee
que tiene las siguientes columnas:
EmpId, FirstName, LastName, Age, Salary
Tengo un procedimiento almacenado GetAllEmpDetails
que tiene la siguiente consulta de selección.
Select
EmpId, (FirstName + '' '' + LastName) as FullName, Salary
from
Employee
Ahora, cuando intento vincular el resultado de este procedimiento almacenado con la clase Employee
que tiene 5 propiedades según la estructura de la tabla, aparece un error que indica que se espera el valor para la propiedad Age
, pero no está disponible en el conjunto de resultados.
Sé que no hay propiedad de nombre FullName
, así que mi pregunta es cómo resolver este problema con la clase de modelo generada (como en este caso, el Employee
) para que pueda abordar este dinamismo.
Cómo mapear un procedimiento almacenado en EF?
Como está haciendo Database First Approach y tiene un archivo EDMX, deje que EF genere la clase del resultado del procedimiento almacenado para usted. Puede tener muchos procedimientos almacenados y desea evitar crear las clases manualmente: después de todo, eso es todo el punto de utilizar una herramienta ORM. Además, algunos de sus procedimientos almacenados pueden tener parámetros. Si lo hace de la manera siguiente manejará todo eso por usted. En realidad es bastante simple.
Para que EF lo haga por usted, siga los pasos a continuación:
- Haga doble clic en su archivo EDMX
- Elija Actualizar modelo desde la base de datos
Verá el cuadro de diálogo similar a la siguiente:
- Asegúrate de haber marcado las casillas como se muestra.
Eso agregará el procedimiento almacenado y lo verá en su navegador modelo como se muestra a continuación:
- Si desea cambiar el nombre de clase generado automáticamente por EF, hágalo. Le sugiero encarecidamente que haga esto y que le dé a su clase un nombre significativo que siga las convenciones de nomenclatura de .NET. La convención que sigo es eliminar cualquier verbo del nombre del procedimiento almacenado y agregar la palabra resultado al final. Así que terminarás con el nombre como se muestra a continuación:
- presiona OK
Algunas notas
Esto es mucho mejor que escribir las clases manualmente en caso de que su nombre de procedimiento almacenado, o los parámetros que necesita, o el resultado que devuelve cambien. Este enfoque funcionará también para las funciones definidas por el usuario.
A Gotcha
Habrá ocasiones en que el procedimiento almacenado no aparecerá en la selección en el cuadro de diálogo del asistente, debido a esto . Simplemente agregue esto al comienzo de su procedimiento almacenado:
SET FMTONLY OFF -- REMEMBER to remove it once the wizard is done.
public class EmployeeProcedure
{
[Column("EmpId")]
public int EmployeeId { get; set; }
[NotMapped]
public string FullName { get; set; }
public double Salary { get; set; }
}
después de eso, llama esto:
this.Database.SqlQuery<EmployeeProcedure>("GetAllEmpDetails");