Condividi tramite


Procedura dettagliata: recupero di tipi di entità con una stored procedure (strumenti di Entity Data Model)

In questo argomento viene illustrato come utilizzare una stored procedure per recuperare una raccolta di tipi di entità. Nella procedura dettagliata si utilizzerà ADO.NET Entity Data Model Designer (Entity Designer) per importare una stored procedure e creare un'importazione di funzioni che restituisce una raccolta di tipi di entità.

L'inclusione di una stored procedure nel modello concettuale consente di chiamare la stored procedure dal codice dell'applicazione. L'aggiunta di una stored procedure al modello concettuale è definita importazione di funzioni. Un'importazione di funzioni può restituire raccolte di tipi semplici, tipi complessi, tipi di entità o nessun valore.

Cc716672.note(it-it,VS.100).gifNota:
Affinché un'importazione di funzioni restituisca un oggetto EntityType, le colonne restituite dalla stored procedure corrispondente devono corrispondere esattamente alle proprietà scalari dell'oggetto EntityType restituito.

Quando si genera un file con estensione edmx da un database tramite la procedura guidata Entity Data Model, nel modello di archiviazione vengono create voci per ogni stored procedure contenuta nel database. Le voci corrispondenti vengono aggiunte al modello concettuale quando viene creata un'importazione di funzioni. Per ulteriori informazioni sulla creazione di un'importazione di funzioni, vedere Procedura: importare una stored procedure (strumenti di Entity Data Model).

Prerequisiti

Per completare questa procedura dettagliata è necessario compilare l'applicazione CourseManager. Per ulteriori informazioni e istruzioni, vedere la Guida rapida di Entity Framework. Dopo avere compilato l'applicazione, se ne modificherà il modello concettuale creando un'importazione di funzioni basata sulla stored procedure GetStudentGrades.

Cc716672.note(it-it,VS.100).gifNota:
Dal momento che in molti argomenti contenenti procedure dettagliate di questa documentazione viene utilizzata l'applicazione CourseManager come punto di partenza, è consigliabile utilizzare una copia di tale applicazione anziché modificarne il codice originale.

In questa procedura dettagliata si presuppone che il lettore disponga di una competenza di base di Visual Studio, .NET Framework e della programmazione in Visual C# o Visual Basic.

Creazione di un'importazione di funzioni

In questa procedura si creerà un'importazione di funzioni basata sulla stored procedure GetStudentGrades inclusa nel modello di archiviazione dell'applicazione CourseManager.

Per creare un'importazione di funzioni

  1. Aprire la soluzione CourseManager in Visual Studio.

  2. In Esplora soluzioni fare doppio clic sul file School.edmx.

    Il file School.edmx verrà aperto in ADO.NET Entity Data Model Designer (Entity Designer) e verrà visualizzata la finestra Browser modello.

  3. Espandere il nodo EntityContainer: SchoolEntities nella finestra Browser modello.

    Le cartelle Set di entità, Set di associazioni e Importazioni di funzioni saranno visibili nella visualizzazione struttura ad albero.

  4. Fare clic con il pulsante destro del mouse su Importazioni di funzioni e selezionare Aggiungi importazione di funzioni.

    Verrà visualizzata la finestra di dialogo Add Function Import.

  5. Selezionare GetStudentGrades nell'elenco a discesa Nome stored procedure.

  6. Digitare GetStudentGrades nella casella di testo Nome importazione di funzioni.

  7. Selezionare Entità come valore restituito, quindi selezionare StudentGrade dall'elenco a discesa corrispondente.

    Cc716672.note(it-it,VS.100).gifNota:
    È possibile impostare il tipo restituito su StudentGrade in quanto le colonne restituite dalla stored procedure GetStudentGrades (EnrollementID, StudentID, CourseID e Grade) corrispondono esattamente alle proprietà scalari del tipo di entità StudentGrade.

  8. Scegliere OK.

    L'oggetto Function Import GetStudentGrades verrà aggiunto al modello concettuale.

Costruzione dell'interfaccia utente

In questa procedura si aggiungerà un nuovo form all'interfaccia utente dell'applicazione CourseManager in modo da poter visualizzare i voti di uno studente selezionato.

Per costruire l'interfaccia utente

  1. Fare clic con il pulsante destro del mouse sul progetto CourseManager in Esplora soluzioni, scegliere Aggiungi, quindi selezionare Nuovo elemento.

    Verrà visualizzata la finestra di dialogo Aggiungi nuovo elemento.

  2. Selezionare Windows Form, impostare il nome del form su GradeViewer.vb o su GradeViewer.cs, quindi fare clic su Aggiungi.

    Un nuovo form verrà aggiunto al progetto e aperto nella finestra di progettazione dei form. Il nome del form viene impostato su GradeViewer, mentre il testo viene impostato su GradeViewer.

  3. Trascinare un controllo ComboBox dalla casella degli strumenti nel form e impostarne il Nome su studentList nella finestra Proprietà.

  4. Trascinare un controllo DataGridView dalla casella degli strumenti nel form e impostarne il Nome su gradeGridView nella finestra Proprietà.

  5. Fare doppio clic sul file CourseViewer.vb o CourseViewer.cs in Esplora soluzioni.

    Il file verrà aperto nella finestra di progettazione dei form.

  6. Trascinare un controllo Button nel form. Impostarne il Nome su viewGrades e il Testo su View Grades.

  7. Fare doppio clic sul controllo viewGrades Button.

    Il gestore eventi viewGrades_Click viene aggiunto al file code-behind.

  8. Aggiungere il codice seguente al gestore eventi viewGrades_Click:

    Dim gradeViewer As New GradeViewer()
    gradeViewer.Visible = True
    
    GradeViewer gradeViewer = new GradeViewer();
    gradeViewer.Visible = true;
    

L'interfaccia utente è ora completa.

Recupero di tipi di entità con una stored procedure

In questa procedura si aggiungerà codice per l'esecuzione dell'importazione di funzioni precedentemente creata dalla stored procedure GetStudentGrades. Il codice assocerà quindi la raccolta di EntityType restituita a un controllo DataGridView. Per ulteriori informazioni sull'associazione di oggetti ai controlli, vedere Binding Objects to Controls (Entity Framework).

Per recuperare i tipi di entità con una stored procedure

  1. Fare doppio clic sul corpo del form GradeViewer dopo averlo aperto nella finestra di progettazione dei form.

    Verrà visualizzato il file code-behind per il form GradeViewer.

  2. Aggiungere le istruzioni using (C#) o Imports (Visual Basic) seguenti:

    Imports System.Data.Objects
    Imports System.Data.Objects.DataClasses
    
    using System.Data.Objects;
    using System.Data.Objects.DataClasses;
    
  3. Aggiungere una proprietà alla classe GradeViewer che rappresenta il contesto dell'oggetto:

    ' Create an ObjectContext instance based on SchoolEntity.
    Private schoolContext As SchoolEntities
    
    // Create an ObjectContext instance based on SchoolEntity.
    private SchoolEntities schoolContext;
    
  4. Nel gestore eventi GradeViewer_Load aggiungere il codice che segue. Tale codice inizializza il contesto dell'oggetto e imposta l'origine dati per il controllo ComboBox su una query che restituisce tutti i tipi Person con EnrollmentDate diverso da null.

    ' Initialize schoolContext.
    schoolContext = New SchoolEntities()
    
    ' Define the query to retrieve students.
    Dim studentQuery As ObjectQuery(Of Person) = schoolContext _
        .People.Where("it.EnrollmentDate is not null") _
        .OrderBy("it.LastName")
    
    ' Execute and bind the studentList control to the query.
    studentList.DataSource = studentQuery _
        .Execute(MergeOption.OverwriteChanges)
    studentList.DisplayMember = "LastName"
    
    schoolContext = new SchoolEntities();
    
    // Define the query to retrieve students.
    ObjectQuery<Person> studentQuery = schoolContext.People
        .Where("it.EnrollmentDate is not null")
        .OrderBy("it.LastName");
    
    // Execute and bind the studentList control to the query.
    studentList.DataSource = studentQuery
        .Execute(MergeOption.OverwriteChanges);
    studentList.DisplayMember = "LastName";
    
  5. Tornare alla visualizzazione Progettazione del form GradeViewer e fare doppio clic sul controllo studentList ComboBox.

    Il gestore eventi studentList_SelectedIndexChanged viene aggiunto al file code-behind.

  6. Aggiungere il codice che segue al gestore eventi studentList_SelectedIndexChanged. Questo codice esegue GetStudentGradesFunctionImport e associa i risultati al controllo DataGridView quando si seleziona un nuovo studente nell'elenco a discesa.

    ' Get the selected student so we can use the
    ' PersonID in the function import call.
    Dim currentStudent As Person = CType(Me.studentList _
        .SelectedItem(), Person)
    
    ' Set the data source for the gradeGridView
    ' to the results returned by the GetStudentGrades
    ' Function Import.
    gradeGridView.DataSource = schoolContext _
        .GetStudentGrades(currentStudent.PersonID)
    gradeGridView.Columns("Course").Visible = False
    gradeGridView.Columns("StudentID").Visible = False
    gradeGridView.Columns("Person").Visible = False
    gradeGridView.Columns("EnrollmentID").Visible = False
    gradeGridView.AllowUserToAddRows = False
    gradeGridView.AllowUserToDeleteRows = False
    
    // Get the selected student so we can use the
    // PersonID in the function import call.
    Person currentStudent = (Person)this.studentList
        .SelectedItem;
    
    // Set the data source for the gradeGridView
    // to the results returned by the GetStudentGrades
    // Function Import.
    gradeGridView.DataSource = schoolContext
        .GetStudentGrades(currentStudent.PersonID);
    gradeGridView.Columns["Course"].Visible = false;
    gradeGridView.Columns["StudentID"].Visible = false;
    gradeGridView.Columns["Person"].Visible = false;
    gradeGridView.Columns["EnrollmentID"].Visible = false;
    gradeGridView.AllowUserToAddRows = false;
    gradeGridView.AllowUserToDeleteRows = false;
    

Premere CTRL+F5 per eseguire l'applicazione. È ora possibile visualizzare le informazioni sui voti dello studente facendo clic su View Grades e selezionando un studente nell'elenco a discesa nel form Grade Viewer

Listato di codice

In questa sezione è contenuta la versione finale del file code-behind del form GradeViewer.

Imports System.Data.Objects
Imports System.Data.Objects.DataClasses
Public Class GradeViewer
    ' Create an ObjectContext instance based on SchoolEntity.
    Private schoolContext As SchoolEntities

    Private Sub GradeViewer_Load(ByVal sender As System.Object, _
                ByVal e As System.EventArgs) Handles MyBase.Load
        ' Initialize schoolContext.
        schoolContext = New SchoolEntities()

        ' Define the query to retrieve students.
        Dim studentQuery As ObjectQuery(Of Person) = schoolContext _
            .People.Where("it.EnrollmentDate is not null") _
            .OrderBy("it.LastName")

        ' Execute and bind the studentList control to the query.
        studentList.DataSource = studentQuery _
            .Execute(MergeOption.OverwriteChanges)
        studentList.DisplayMember = "LastName"
    End Sub

    Private Sub studentList_SelectedIndexChanged(ByVal sender As  _
        System.Object, ByVal e As System.EventArgs) Handles _
        studentList.SelectedIndexChanged
        ' Get the selected student so we can use the
        ' PersonID in the function import call.
        Dim currentStudent As Person = CType(Me.studentList _
            .SelectedItem(), Person)

        ' Set the data source for the gradeGridView
        ' to the results returned by the GetStudentGrades
        ' Function Import.
        gradeGridView.DataSource = schoolContext _
            .GetStudentGrades(currentStudent.PersonID)
        gradeGridView.Columns("Course").Visible = False
        gradeGridView.Columns("StudentID").Visible = False
        gradeGridView.Columns("Person").Visible = False
        gradeGridView.Columns("EnrollmentID").Visible = False
        gradeGridView.AllowUserToAddRows = False
        gradeGridView.AllowUserToDeleteRows = False
    End Sub
End Class
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data.Objects;
using System.Data.Objects.DataClasses;

namespace CourseManager
{
    public partial class GradeViewer : Form
    {
        // Create an ObjectContext instance based on SchoolEntity.
        private SchoolEntities schoolContext;

        public GradeViewer()
        {
            InitializeComponent();
        }

        private void GradeViewer_Load(object sender, EventArgs e)
        {
            schoolContext = new SchoolEntities();

            // Define the query to retrieve students.
            ObjectQuery<Person> studentQuery = schoolContext.People
                .Where("it.EnrollmentDate is not null")
                .OrderBy("it.LastName");

            // Execute and bind the studentList control to the query.
            studentList.DataSource = studentQuery
                .Execute(MergeOption.OverwriteChanges);
            studentList.DisplayMember = "LastName";
        }

        private void studentList_SelectedIndexChanged(object sender, EventArgs e)
        {
            // Get the selected student so we can use the
            // PersonID in the function import call.
            Person currentStudent = (Person)this.studentList
                .SelectedItem;

            // Set the data source for the gradeGridView
            // to the results returned by the GetStudentGrades
            // Function Import.
            gradeGridView.DataSource = schoolContext
                .GetStudentGrades(currentStudent.PersonID);
            gradeGridView.Columns["Course"].Visible = false;
            gradeGridView.Columns["StudentID"].Visible = false;
            gradeGridView.Columns["Person"].Visible = false;
            gradeGridView.Columns["EnrollmentID"].Visible = false;
            gradeGridView.AllowUserToAddRows = false;
            gradeGridView.AllowUserToDeleteRows = false;
        }
    }
}

Passaggi successivi

L'importazione di funzioni che recupera una raccolta di tipi di entità è stata correttamente creata. Per ulteriori informazioni sulla compilazione di applicazioni che utilizzano Entity Framework, vedere ADO.NET Entity Framework.

Vedere anche

Altre risorse

Scenari degli strumenti di Entity Data Model
Attività degli strumenti di Entity Data Model