Definieren einer Abfrage (EF-Designer)Defining Query - EF Designer

In dieser exemplarischen Vorgehensweise wird veranschaulicht, wie mit dem EF-Designer eine definierende Abfrage und ein entsprechender Entitätstyp zu einem Modell hinzugefügt werden.This walkthrough demonstrates how to add a defining query and a corresponding entity type to a model using the EF Designer. Eine definierende Abfrage wird häufig verwendet, um ähnliche Funktionen wie in einer Daten Bank Ansicht bereitzustellen, aber die Sicht wird im Modell und nicht in der Datenbank definiert.A defining query is commonly used to provide functionality similar to that provided by a database view, but the view is defined in the model, not the database. Eine definierende Abfrage ermöglicht das Ausführen einer SQL-Anweisung, die im DefiningQuery-   Element einer EDMX-Datei angegeben ist.A defining query allows you to execute a SQL statement that is specified in the DefiningQuery element of an .edmx file. Weitere Informationen finden Sie unter DefiningQuery in der SSDL-Spezifikation.For more information, see DefiningQuery in the SSDL Specification.

Wenn Sie die Definition von Abfragen verwenden, müssen Sie auch einen Entitätstyp in Ihrem Modell definieren.When using defining queries, you also have to define an entity type in your model. Der Entitätstyp wird verwendet, um von der definierenden Abfrage verfügbar gemachte Daten zu übernehmen.The entity type is used to surface data exposed by the defining query. Beachten Sie, dass Daten, die über diesen Entitätstyp über gestellt werden, schreibgeschützt sind.Note that data surfaced through this entity type is read-only.

Parametrisierte Abfragen können nicht als definierende Abfragen ausgeführt werden.Parameterized queries cannot be executed as defining queries. Die Daten können jedoch aktualisiert werden, indem die Insert-, Update- und Delete-Funktionen des Entitätstyps, der die Daten zugänglich macht, gespeicherten Prozeduren zugeordnet werden.However, the data can be updated by mapping the insert, update, and delete functions of the entity type that surfaces the data to stored procedures. Weitere Informationen finden Sie unter Einfügen, aktualisieren und Löschen mit gespeicherten Prozeduren.For more information, see Insert, Update, and Delete with Stored Procedures.

In diesem Thema wird gezeigt, wie die folgenden Aufgaben ausgeführt werden.This topic shows how to perform the following tasks.

  • Hinzufügen einer definierenden AbfrageAdd a Defining Query
  • Hinzufügen eines Entitäts Typs zum ModellAdd an Entity Type to the Model
  • Zuordnen der definierenden Abfrage zum EntitätstypMap the Defining Query to the Entity Type

VoraussetzungenPrerequisites

Um die exemplarische Vorgehensweise nachzuvollziehen, benötigen Sie Folgendes:To complete this walkthrough, you will need:

Einrichten des ProjektsSet up the Project

In dieser exemplarischen Vorgehensweise wird Visual Studio 2012 oder höher verwendet.This walkthrough is using Visual Studio 2012 or newer.

  • Öffnen Sie Visual Studio.Open Visual Studio.
  • Zeigen Sie im Menü Datei auf Neu, und klicken Sie dann auf Projekt.On the File menu, point to New, and then click Project.
  • Klicken Sie im linken Bereich auf **Visual C # **, und wählen Sie dann die Vorlage Konsolenanwendung aus.In the left pane, click Visual C#, and then select the Console Application template.
  • Geben Sie definingquerysample als Namen für das Projekt ein, und klicken Sie auf OK.Enter DefiningQuerySample as the name of the project and click OK.

 

Erstellen eines Modells auf der Grundlage der Datenbank "School"Create a Model based on the School Database

  • Klicken Sie in Projektmappen-Explorer mit der rechten Maustaste auf den Projektnamen, zeigen Sie auf Hinzufügen, und klicken Sie dann auf Neues Element.Right-click the project name in Solution Explorer, point to Add, and then click New Item.

  • Wählen Sie im linken Menü Daten aus, und wählen Sie dann im Bereich Vorlagen die Option ADO.NET Entity Data Model aus.Select Data from the left menu and then select ADO.NET Entity Data Model in the Templates pane.

  • Geben Sie definingquerymodel. edmx als Dateiname ein, und klicken Sie dann auf Hinzufügen.Enter DefiningQueryModel.edmx for the file name, and then click Add.

  • Wählen Sie im Dialogfeld Modell Inhalte auswählen die Option aus Datenbank generieren aus, und klicken Sie dann auf weiter.In the Choose Model Contents dialog box, select Generate from database, and then click Next.

  • Klicken Sie auf neue Verbindung.Click New Connection. Geben Sie im Dialogfeld Verbindungs Eigenschaften den Servernamen ein (z. b. (localdb) \ mssqllocaldb), wählen Sie die Authentifizierungsmethode aus, geben Sie School   als Datenbanknamen School ein, und klicken Sie dann auf OK.In the Connection Properties dialog box, enter the server name (for example, (localdb)\mssqllocaldb), select the authentication method, type School for the database name, and then click OK. Das Dialogfeld Wählen Sie Ihre Datenverbindung aus wird mit Ihrer Daten bankverbindungs Einstellung aktualisiert.The Choose Your Data Connection dialog box is updated with your database connection setting.

  • Überprüfen Sie im Dialogfeld Wählen Sie Ihre Datenbankobjekte aus den Knoten Tabellen   .In the Choose Your Database Objects dialog box, check the Tables node. Dadurch werden alle Tabellen dem Modell " School " hinzugefügt.This will add all the tables to the School model.

  • Klicken Sie auf Finish.Click Finish.

  • Klicken Sie in Projektmappen-Explorer mit der rechten Maustaste auf die Datei definingquerymodel. edmx , und wählen Sie Öffnen mit... aus.In Solution Explorer, right-click the DefiningQueryModel.edmx file and select Open With….

  • Wählen Sie den XML-Editor (Text) aus.Select XML (Text) Editor.

    XML-Editor

  • Klicken Sie auf Ja , wenn Sie mit der folgenden Meldung aufgefordert werden:Click Yes if prompted with the following message:

    Warnung 2

 

Hinzufügen einer definierenden AbfrageAdd a Defining Query

In diesem Schritt wird der XML-Editor verwendet, um dem SSDL-Abschnitt der EDMX-Datei eine definierende Abfrage und einen Entitätstyp hinzuzufügen.In this step we will use the XML Editor to add a defining query and an entity type to the SSDL section of the .edmx file. 

  • Fügen Sie EntitySet   dem SSDL-Abschnitt der EDMX-Datei ein EntitySet-Element hinzu (Zeile 5 bis 13).Add an EntitySet element to the SSDL section of the .edmx file (line 5 thru 13). Geben Sie Folgendes an:Specify the following:
    • Es werden nur die Attribute Name   und EntityType   des EntitySet-   Elements angegeben.Only the Name and EntityType attributes of the EntitySet element are specified.
    • Der voll qualifizierte Name des Entitäts Typs wird im EntityType-   Attribut verwendet.The fully-qualified name of the entity type is used in the EntityType attribute.
    • Die auszuführende SQL-Anweisung wird im DefiningQuery-   Element angegeben.The SQL statement to be executed is specified in the DefiningQuery element.
    <!-- 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" />
  • Fügen Sie das EntityType -Element dem SSDL-Abschnitt der EDMX-Datei hinzu.Add the EntityType element to the SSDL section of the .edmx. Datei wie unten gezeigt.file as shown below. Beachten Sie Folgendes:Note the following:
    • Der Wert des Attributs " Name " entspricht dem Wert des Attributs " EntityType " im obigen EntitySet -Element, obwohl der voll qualifizierte Name des Entitäts Typs im EntityType -Attribut verwendet wird.The value of the Name attribute corresponds to the value of the EntityType attribute in the EntitySet element above, although the fully-qualified name of the entity type is used in the EntityType attribute.
    • Die Eigenschaftsnamen entsprechen den Spaltennamen, die von der SQL-Anweisung im DefiningQuery -Element (oben) zurückgegeben werden.The property names correspond to the column names returned by the SQL statement in the DefiningQuery element (above).
    • In diesem Beispiel wird durch einen aus drei Eigenschaften bestehenden Entitätsschlüssel sichergestellt, dass der Schlüsselwert eindeutig ist.In this example, the entity key is composed of three properties to ensure a unique key value.
    <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>

Hinweis

Wenn Sie später den Modellaktualisierungs-Assistenten ausführen, werden alle Änderungen, die am Speichermodell vorgenommen werden, einschließlich der Definition von Abfragen, überschrieben.If later you run the Update Model Wizard dialog, any changes made to the storage model, including defining queries, will be overwritten.

 

Hinzufügen eines Entitäts Typs zum ModellAdd an Entity Type to the Model

In diesem Schritt fügen wir den Entitätstyp mit dem EF-Designer dem konzeptionellen Modell hinzu.In this step we will add the entity type to the conceptual model using the EF Designer. Beachten Sie Folgendes: Note the following:

  • Der Name der Entität entspricht dem Wert des Attributs EntityType im obigen EntitySet -Element.The Name of the entity corresponds to the value of the EntityType attribute in the EntitySet element above.
  • Die Eigenschaftsnamen entsprechen den Spaltennamen, die von der SQL-Anweisung im obigen DefiningQuery -Element zurückgegeben werden.The property names correspond to the column names returned by the SQL statement in the DefiningQuery element above.
  • In diesem Beispiel wird durch einen aus drei Eigenschaften bestehenden Entitätsschlüssel sichergestellt, dass der Schlüsselwert eindeutig ist.In this example, the entity key is composed of three properties to ensure a unique key value.

Öffnen Sie das Modell im EF-Designer.Open the model in the EF Designer.

  • Doppelklicken Sie auf definingquerymodel. edmx.Double-click the DefiningQueryModel.edmx.

  • Sagen Sie Ja , dass die folgende Meldung angezeigt wird:Say Yes to the following message:

    Warnung 2

 

Die Entity Designer, die eine Entwurfs Oberfläche zum Bearbeiten des Modells bereitstellt, wird angezeigt.The Entity Designer, which provides a design surface for editing your model, is displayed.

  • Klicken Sie mit der rechten Maustaste auf die Designer Oberfläche, und wählen Sie neue - > Entitäthinzufügen aus.Right-click the designer surface and select Add New->Entity….
  • Geben Sie für den Entitäts Namen und den CourseID für die Schlüsseleigenschaftden Wert gradereport an.Specify GradeReport for the entity name and CourseID for the Key Property.
  • Klicken Sie mit der rechten Maustaste auf die Entität gradereport , und wählen Sie neue - > skalare EigenschafthinzufügenRight-click the GradeReport entity and select Add New-> Scalar Property.
  • Ändern Sie den Standardnamen der Eigenschaft in FirstName.Change the default name of the property to FirstName.
  • Fügen Sie eine weitere skalare Eigenschaft hinzu, und geben Sie LastName als Name an.Add another scalar property and specify LastName for the name.
  • Fügen Sie eine weitere skalare Eigenschaft hinzu, und geben Sie Grade für den Namen an.Add another scalar property and specify Grade for the name.
  • Ändern Sie im Eigenschaften Fenster die Type -Eigenschaft der Klassein Decimal.In the Properties window, change the Grade’s Type property to Decimal.
  • Wählen Sie die Eigenschaften FirstName und LastName aus.Select the FirstName and LastName properties.
  • Ändern Sie im Eigenschaften Fenster den Wert der EntityKey -Eigenschaft in true.In the Properties window, change the EntityKey property value to True.

Folglich wurden dem CSDL -Abschnitt der EDMX-Datei die folgenden Elemente hinzugefügt.As a result, the following elements were added to the CSDL section of the .edmx file.

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

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

 

Zuordnen der definierenden Abfrage zum EntitätstypMap the Defining Query to the Entity Type

In diesem Schritt wird das Fenster Mappingdetails verwendet, um die konzeptionellen Entitäts Typen und Speicher Entitäts Typen zuzuordnen.In this step, we will use the Mapping Details window to map the conceptual and storage entity types.

  • Klicken Sie mit der rechten Maustaste auf die Entität gradereport auf der Entwurfs Oberfläche, und wählen Sie Tabellen Zuordnung.Right-click the GradeReport entity on the design surface and select Table Mapping.
    Das Fenster Mappingdetails wird angezeigt.The Mapping Details window is displayed.
  • Wählen Sie in der Dropdown Liste ** < Tabelle oder > Sicht hinzufügen** den Wert gradereport aus (befindet sich unter Tabelles).Select GradeReport from the <Add a Table or View> dropdown list (located under Tables).
    Standard Zuordnungen zwischen dem Entitätstyp GradeReport "konzeptionell" und "Speicher" werden angezeigt.Default mappings between the conceptual and storage GradeReport entity type appear.
    Mapping Details3Mapping Details3

Folglich wird das EntitySetMapping-   Element dem Mapping-Abschnitt der EDMX-Datei hinzugefügt.As a result, the EntitySetMapping element is added to the mapping section of the .edmx file. 

    <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>
  • Kompilieren Sie die Anwendung.Compile the application.

 

Die definierende Abfrage im Code aufzurufenCall the Defining Query in your Code

Sie können jetzt die definierende Abfrage ausführen, indem Sie den Entitätstyp gradereportierung verwenden.You can now execute the defining query by using the GradeReport entity type. 

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