Stored Procedure e EF

Entity Framework supporta le Stored Procedure attraverso le “Function Imports”, le quali creano dei metodi all’interno della classe “DbContext” per mezzo dei quali è possibile chiamare le varie Stored Procedure.
using (NorthwindEntities northWindContext = new NorthwindEntities())
{
List employeesList = northWindContext.spGetEmployees().ToList();
}
public virtual ObjectResult spGetEmployees()
{
return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction("spGetEmployees");
}

Nel codice mostrato sopra c’è un esempio di una chiamata ad un metodo creato importando la Stored Procedure, e l’implementazione del metodo stesso.

Le Stored Procedure gestite attraverso l’utility “Function Import” possono avere differenti valori di ritorno:

  • None: il metodo non restituisce un valore;
  • Scalar: il metodo restituisce un valore scalare (es. un int o String);
  • Complex: il metodo restituisce un oggetto o una collection di oggetti, le proprietà dell’oggetto corrispondo alle colonne del result set restituito dalla Stored Procedure;
  • Entitties: il metodo restituisce un’entity o una collection di entity importata da Entity Framework nel DbContext (vedi foto).

A volte quando viene aggiornato il DbContext in seguito a modifiche fatte alla struttura del database, può capitare che il metodo definito per la chiamata alla Stored Procedure venga cancellato, in questi casi bisogna ridefinire l’associazione per tutte le Stored Procedure coinvolte.

Per evitare di seguire questa operazione ogni volta, io preferisco chiamare le Stored Procedure utilizzando il metodo “SqlQuery” il quale permette di inviare un comando a Sql Server (SqlCommand) tramite EF.

  • Chiamata ad una Stored Procedure che restituisce uno scalare:

    using (NorthwindEntities ctx = new NorthwindEntities())
    {
    countList = ctx.Database.SqlQuery("exec spGetEmployeesCount").Single();
    Console.WriteLine("Employees count is: {0}", countList);
    }
  • Chiamata ad una Stored Procedure che restituisce un entity:

    using (NorthwindEntities ctx = new NorthwindEntities())
    {
    employeesItem = ctx.Database.SqlQuery("exec spGetEmployee @EmployeeID = {0}",
    employeesId).Single();
    if (employeesItem != null)
    Console.WriteLine("Item - FirstName: {0} and LastName: {1}", employeesItem.FirstName,
    employeesItem.LastName);
    }
  • Chiamata ad una Stored Procedure che restituisce una collection di entity (utilizzo una List<>):

    using (NorthwindEntities ctx = new NorthwindEntities())
    {
    employeeList = ctx.Database.SqlQuery("exec spGetEmployees").ToList();
    Console.WriteLine("Count: {0}", employeeList.Count);
    for (int i = 0; i < employeeList.Count; i++)
    Console.WriteLine("Employee: {0} {1}", employeeList[i].FirstName, employeeList[i].LastName);
    Console.WriteLine();
    }

Nel caso in cui viene utilizzato il metodo “SqlQuery” per chiamare una Stored Procedure, essa può anche non essere importata da EF.

Leave a Reply

Your email address will not be published. Required fields are marked *