Share via


Definizione di query - Ef Designer

Questa procedura dettagliata illustra come aggiungere una query di definizione e un tipo di entità corrispondente a un modello usando Entity Designer. Una query di definizione viene comunemente usata per fornire funzionalità simili a quella fornita da una vista di database, ma la vista è definita nel modello, non nel database. Una query di definizione consente di eseguire un'istruzione SQL specificata nell'elemento DefiningQuery di un file con estensione edmx. Per altre informazioni, vedere Definizione diQuery nella specifica SSDL.

Quando si usano le query di definizione, è necessario definire anche un tipo di entità nel modello. Il tipo di entità viene usato per esporre i dati esposti dalla query di definizione. Si noti che i dati visualizzati tramite questo tipo di entità sono di sola lettura.

Le query con parametri non possono essere eseguite come query di definizione. Tuttavia, è possibile aggiornare i dati eseguendo il mapping delle funzioni di inserimento, aggiornamento ed eliminazione del tipo di entità che fa emergere i dati nelle stored procedure. Per altre informazioni, vedere Inserimento, aggiornamento ed eliminazione con stored procedure.

In questo argomento viene illustrato come eseguire le attività seguenti.

  • Aggiungere una query di definizione
  • Aggiungere un tipo di entità al modello
  • Eseguire il mapping della query di definizione al tipo di entità

Prerequisiti

Per completare questa procedura dettagliata, sarà necessario:

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

Configurare il progetto

Questa procedura dettagliata usa Visual Studio 2012 o versione successiva.

  • Aprire Visual Studio.
  • Scegliere Nuovo dal menu Filee quindi fare clic su Progetto.
  • Nel riquadro sinistro fare clic su Visual C# e quindi selezionare il modello Applicazione console.
  • Immettere DefinizioneQuerySample come nome del progetto e fare clic su OK.

 

Creare un modello basato sul database dell'istituto di istruzione

  • Fare clic con il pulsante destro del mouse sul nome del progetto in Esplora soluzioni, scegliere Aggiungi e quindi fare clic su Nuovo elemento.

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

  • Immettere DefinizioneQueryModel.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 il nodo Tabelle . Verranno aggiunte tutte le tabelle al modello School .

  • Fare clic su Fine.

  • In Esplora soluzioni fare clic con il pulsante destro del mouse sul file DefiningQueryModel.edmx e scegliere Apri con.

  • Selezionare Editor XML (testo).

    XML Editor

  • Fare clic su se viene richiesto il messaggio seguente:

    Warning 2

 

Aggiungere una query di definizione

In questo passaggio si userà l'editor XML per aggiungere una query di definizione e un tipo di entità alla sezione SSDL del file con estensione edmx. 

  • Aggiungere un elemento EntitySet alla sezione SSDL del file con estensione edmx (riga 5 a 13). Specificare quanto segue:
    • Vengono specificati solo gli attributi Name e EntityType dell'elemento EntitySet .
    • Il nome completo del tipo di entità viene usato nell'attributo EntityType .
    • L'istruzione SQL da eseguire viene specificata nell'elemento DefiningQuery .
    <!-- SSDL content -->
    <edmx:StorageModels>
      <Schema Namespace="SchoolModel.Store" Alias="Self" Provider="System.Data.SqlClient" ProviderManifestToken="2008" xmlns:store="http://schemas.microsoft.com/ado/2007/12/edm/EntityStoreSchemaGenerator" xmlns="http://schemas.microsoft.com/ado/2009/11/edm/ssdl">
        <EntityContainer Name="SchoolModelStoreContainer">
           <EntitySet Name="GradeReport" EntityType="SchoolModel.Store.GradeReport">
              <DefiningQuery>
                SELECT CourseID, Grade, FirstName, LastName
                FROM StudentGrade
                JOIN
                (SELECT * FROM Person WHERE EnrollmentDate IS NOT NULL) AS p
                ON StudentID = p.PersonID
              </DefiningQuery>
          </EntitySet>
          <EntitySet Name="Course" EntityType="SchoolModel.Store.Course" store:Type="Tables" Schema="dbo" />
  • Aggiungere l'elemento EntityType alla sezione SSDL di .edmx. file come illustrato di seguito. Notare quanto segue:
    • Il valore dell'attributo Name corrisponde al valore dell'attributo EntityType nell'elemento EntitySet precedente, anche se il nome completo del tipo di entità viene usato nell'attributo EntityType .
    • I nomi delle proprietà corrispondono ai nomi di colonna restituiti dall'istruzione SQL nell'elemento DefiningQuery (sopra).
    • In questo esempio la chiave di entità è composta da tre proprietà, per assicurare un valore di chiave univoco.
    <EntityType Name="GradeReport">
      <Key>
        <PropertyRef Name="CourseID" />
        <PropertyRef Name="FirstName" />
        <PropertyRef Name="LastName" />
      </Key>
      <Property Name="CourseID"
                Type="int"
                Nullable="false" />
      <Property Name="Grade"
                Type="decimal"
                Precision="3"
                Scale="2" />
      <Property Name="FirstName"
                Type="nvarchar"
                Nullable="false"
                MaxLength="50" />
      <Property Name="LastName"
                Type="nvarchar"
                Nullable="false"
                MaxLength="50" />
    </EntityType>

Nota

Se in un secondo momento si esegue la finestra di dialogo Aggiornamento guidato modello, tutte le modifiche apportate al modello di archiviazione, inclusa la definizione delle query, verranno sovrascritte.

 

Aggiungere un tipo di entità al modello

In questo passaggio si aggiungerà il tipo di entità al modello concettuale usando Entity Framework Designer.  Notare quanto segue:

  • Il nome dell'entità corrisponde al valore dell'attributo EntityType nell'elemento EntitySet precedente.
  • I nomi delle proprietà corrispondono ai nomi di colonna restituiti dall'istruzione SQL nell'elemento DefiningQuery precedente.
  • In questo esempio la chiave di entità è composta da tre proprietà, per assicurare un valore di chiave univoco.

Aprire il modello in Entity Framework Designer.

  • Fare doppio clic su DefiningQueryModel.edmx.

  • Pronunciare al messaggio seguente:

    Warning 2

 

Viene visualizzato Entity Designer, che fornisce un'area di progettazione per la modifica del modello.

  • Fare clic con il pulsante destro del mouse sull'area di progettazione e scegliere Aggiungi nuova> entità.
  • Specificare GradeReport per il nome dell'entità e CourseID per la proprietà Key.
  • Fare clic con il pulsante destro del mouse sull'entità GradeReport e scegliere Aggiungi nuova> proprietà scalare.
  • Modificare il nome predefinito della proprietà in FirstName.
  • Aggiungere un'altra proprietà scalare e specificare LastName per il nome.
  • Aggiungere un'altra proprietà scalare e specificare Grade per il nome.
  • Nella finestra Proprietà modificare la proprietà Type di Grade impostandola su Decimal.
  • Selezionare le proprietà FirstName e LastName .
  • Nella finestra Proprietà modificare il valore della proprietà EntityKey su True.

Di conseguenza, gli elementi seguenti sono stati aggiunti alla sezione CSDL del file con estensione edmx.

    <EntitySet Name="GradeReport" EntityType="SchoolModel.GradeReport" />

    <EntityType Name="GradeReport">
    . . .
    </EntityType>

 

Eseguire il mapping della query di definizione al tipo di entità

In questo passaggio verrà usata la finestra Dettagli mapping per eseguire il mapping dei tipi di entità concettuali e di archiviazione.

  • Fare clic con il pulsante destro del mouse sull'entità GradeReport nell'area di progettazione e selezionare Mapping tabella.
    Viene visualizzata la finestra Dettagli mapping.
  • Selezionare GradeReport nell'elenco <a discesa Aggiungi tabella o vista> (disponibile in Tabellas).
    Vengono visualizzati i mapping predefiniti tra il tipo di entità Conceptual e Storage GradeReport .
    Mapping Details3

Di conseguenza, l'elemento EntitySetMapping viene aggiunto alla sezione mapping del file con estensione edmx. 

    <EntitySetMapping Name="GradeReports">
      <EntityTypeMapping TypeName="IsTypeOf(SchoolModel.GradeReport)">
        <MappingFragment StoreEntitySet="GradeReport">
          <ScalarProperty Name="LastName" ColumnName="LastName" />
          <ScalarProperty Name="FirstName" ColumnName="FirstName" />
          <ScalarProperty Name="Grade" ColumnName="Grade" />
          <ScalarProperty Name="CourseID" ColumnName="CourseID" />
        </MappingFragment>
      </EntityTypeMapping>
    </EntitySetMapping>
  • Compilare l'applicazione.

 

Chiamare la query di definizione nel codice

È ora possibile eseguire la query di definizione usando il tipo di entità GradeReport

    using (var context = new SchoolEntities())
    {
        var report = context.GradeReports.FirstOrDefault();
        Console.WriteLine("{0} {1} got {2}",
            report.FirstName, report.LastName, report.Grade);
    }