Stored procedure query della finestra di progettazione

Questa procedura dettagliata illustra come usare Entity Framework Designer (EF Designer) per importare stored procedure in un modello e quindi chiamare le stored procedure importate per recuperare i risultati.

Si noti che Code First non supporta il mapping a stored procedure o funzioni. È tuttavia possibile chiamare stored procedure o funzioni usando il metodo System.Data.Entity.DbSet.SqlQuery. Ad esempio:

var query = context.Products.SqlQuery("EXECUTE [dbo].[GetAllProducts]")`;

Prerequisiti

Per completare questa procedura dettagliata, sarà necessario:

  • Una versione recente di Visual Studio.
  • Database di esempio School.

Configurare il progetto

  • Aprire Visual Studio 2012.
  • Selezionare File -> Nuovo -> Progetto
  • Nel riquadro sinistro fare clic su Visual C#, quindi selezionare il modello console .
  • Immettere EFwithSProcsSample come nome.
  • Seleziona OK.

Create a Model (Creare un modello)

  • Fare clic con il pulsante destro del mouse sul progetto in Esplora soluzioni e scegliere Aggiungi -> Nuovo elemento.

  • Selezionare Dati dal menu a sinistra e quindi selezionare ADO.NET Entity Data Model nel riquadro Modelli.

  • Immettere EFwithSProcsModel.edmx per il nome del file e quindi fare clic su Aggiungi.

  • Nella finestra di dialogo Scegli contenuto modello selezionare Genera dal database e quindi fare clic su Avanti.

  • Fare clic su Nuovo Connessione ion.
    Nella finestra di dialogo Proprietà Connessione ion immettere il nome del server ( ad esempio (localdb)\mssqllocaldb), selezionare il metodo di autenticazione, digitare School per il nome del database e quindi fare clic su OK.
    La finestra di dialogo Choose Your Data Connessione ion viene aggiornata con l'impostazione di connessione al database.

  • Nella finestra di dialogo Scegli oggetti di database selezionare la casella di controllo Tabelle per selezionare tutte le tabelle.
    Selezionare anche le stored procedure seguenti nel nodo Stored procedure e funzioni GetStudentGrades e GetDepartmentName.

    Import Stored Procedures

    A partire da Visual Studio 2012 Ef Designer supporta l'importazione bulk di stored procedure. Per impostazione predefinita, le stored procedure e le funzioni selezionate importano nel modello di entità.

  • Fare clic su Fine.

Per impostazione predefinita, la forma del risultato di ogni stored procedure o funzione importata che restituisce più di una colonna diventerà automaticamente un nuovo tipo complesso. In questo esempio si vuole eseguire il mapping dei risultati della funzione GetStudentGrades all'entità StudentGrade e ai risultati di GetDepartmentName su nessuno (nessuno è il valore predefinito).

Affinché un'importazione di funzioni restituisca un tipo di entità, le colonne restituite dalla stored procedure corrispondente devono corrispondere esattamente alle proprietà scalari del tipo di entità restituito. Un'importazione di funzioni può anche restituire raccolte di tipi semplici, tipi complessi o nessun valore.

  • Fare clic con il pulsante destro del mouse sull'area di progettazione e selezionare Browser modelli.
  • In Browser modelli selezionare Importazioni di funzioni e quindi fare doppio clic sulla funzione GetStudentGrades .
  • Nella finestra di dialogo Modifica importazione funzione selezionare Entità e scegliere StudentGrade.
    La casella di controllo Importazione funzione è componibile nella parte superiore della finestra di dialogo Importazioni funzioni consentirà di eseguire il mapping alle funzioni componibili. Se si seleziona questa casella, nell'elenco a discesa Stored procedure/Nome funzione verranno visualizzate solo le funzioni componibili (Funzioni con valori di tabella). Se non si seleziona questa casella, nell'elenco verranno visualizzate solo le funzioni non componibili.

Usare il modello

Aprire il file Program.cs in cui è definito il metodo Main . Aggiungere il codice seguente alla funzione Main.

Il codice chiama due stored procedure: GetStudentGrades (restituisce StudentGrades per studentId specificato) e GetDepartmentName (restituisce il nome del reparto nel parametro di output).  

    using (SchoolEntities context = new SchoolEntities())
    {
        // Specify the Student ID.
        int studentId = 2;

        // Call GetStudentGrades and iterate through the returned collection.
        foreach (StudentGrade grade in context.GetStudentGrades(studentId))
        {
            Console.WriteLine("StudentID: {0}\tSubject={1}", studentId, grade.Subject);
            Console.WriteLine("Student grade: " + grade.Grade);
        }

        // Call GetDepartmentName.
        // Declare the name variable that will contain the value returned by the output parameter.
        ObjectParameter name = new ObjectParameter("Name", typeof(String));
        context.GetDepartmentName(1, name);
        Console.WriteLine("The department name is {0}", name.Value);

    }

Compilare l'applicazione ed eseguirla. Il programma produce l'output seguente:

StudentID: 2
Student grade: 4.00
StudentID: 2
Student grade: 3.50
The department name is Engineering

Parametri di output

Se vengono usati parametri di output, i relativi valori non saranno disponibili fino a quando i risultati non saranno stati letti completamente. Ciò è dovuto al comportamento sottostante di DbDataReader, vedere Recupero di dati tramite un DataReader per altri dettagli.