Definieren von Abfragen – EF Designer

In dieser exemplarischen Vorgehensweise wird das Hinzufügen einer definierenden Abfrage und eines entsprechenden Entitätstyps zu einem Modell mithilfe des EF Designers veranschaulicht. Eine definierende Abfrage wird im Allgemeinen verwendet, um eine ähnliche Funktion wie mit einer Datenbanksicht bereitzustellen, die Sicht wird dabei aber nicht in der Datenbank definiert, sondern im Modell. Mit einer definierenden Abfrage können Sie eine im DefiningQuery-Element einer EDMX-Datei angegebene SQL-Anweisung ausführen. Weitere Informationen finden Sie unter DefiningQuery in der SSDL-Spezifikation.

Beim Verwenden definierender Abfragen müssen Sie auch einen Entitätstyp in Ihrem Modell definieren. Der Entitätstyp wird verwendet, um von der definierenden Abfrage verfügbar gemachte Daten zugänglich zu machen. Die durch diesen Entitätstyp verfügbar gemachten Daten sind schreibgeschützt.

Parametrisierte Abfragen können nicht als definierende Abfragen ausgeführt werden. 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. Weitere Informationen finden Sie unter Einfügen, Aktualisieren und Löschen in gespeicherten Prozeduren.

In diesem Thema wird erläutert, wie die folgenden Aufgaben ausgeführt werden.

  • Hinzufügen einer definierenden Abfrage
  • Hinzufügen eines Entitätstyps zu dem Modell
  • Zuordnen der definierenden Abfrage zum Entitätstyp

Voraussetzungen

Für diese exemplarische Vorgehensweise gelten folgende Voraussetzungen:

  • Eine aktuelle Version von Visual Studio.
  • Die Beispieldatenbank School

Einrichten des Projekts

Diese exemplarische Vorgehensweise basiert auf Visual Studio 2012 oder höher.

  • Öffnen Sie Visual Studio.
  • Zeigen Sie im Menü Datei auf Neu, und klicken Sie dann auf Projekt.
  • Klicken Sie im linken Bereich auf Visual C#, und wählen Sie dann die Vorlage Konsolenanwendung aus.
  • Geben Sie DefiningQuerySample als Namen des Projekts ein, und klicken Sie auf OK.

 

Erstellen eines Modells basierend auf der Datenbank „School“

  • Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf den Projektnamen, klicken Sie auf Hinzufügen und anschließend auf Neues Element.

  • Wählen Sie Daten im linken Menü aus, und wählen Sie dann im Bereich „Vorlagen“ ADO.NET Entity Data Model aus.

  • Geben Sie DefiningQueryModel.edmx als Dateinamen ein, und klicken Sie dann auf Hinzufügen.

  • Wählen Sie im Dialogfeld „Modellinhalt auswählen“ Aus Datenbank generieren aus, und klicken Sie dann auf Weiter.

  • Klicken Sie auf „Neue Verbindung“. Geben Sie im Dialogfeld „Verbindungseigenschaften“ den Servernamen ein (z. B. (localdb)\mssqllocaldb), wählen Sie die Authentifizierungsmethode aus, geben Sie School als Datenbanknamen ein, und klicken Sie dann auf OK. Das Dialogfeld „Datenverbindung auswählen“ wird mit Ihrer Datenbankverbindungseinstellung aktualisiert.

  • Aktivieren Sie im Dialogfeld „Datenbankobjekte auswählen“ den Knoten Tabellen. Dadurch werden alle Tabellen dem Modell School hinzugefügt.

  • Klicken Sie auf Fertig stellen.

  • Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf die Datei DefiningQueryModel.edmx, und wählen Sie Öffnen mit aus.

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

    XML Editor

  • Klicken Sie auf Ja, wenn die folgenden Aufforderung angezeigt wird:

    Warning 2

 

Hinzufügen einer definierenden Abfrage

In diesem Schritt verwenden Sie den XML-Editor, um dem Abschnitt „SSDL“ der EDMX-Datei eine definierende Abfrage und einen Entitätstyp hinzuzufügen. 

  • Fügen Sie dem Abschnitt „SSDL“ der EDMX-Datei (Zeilen 5–13) ein EntitySet-Element hinzu. Geben Sie Folgendes an:
    • Es werden nur die Attribute Name und EntityType des EntitySet-Elements angegeben.
    • Im EntityType-Attribut wird der vollqualifizierte Name des Entitätstyps verwendet.
    • Die auszuführende SQL-Anweisung wird im DefiningQuery-Element angegeben.
    <!-- 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 dem Abschnitt „SSDL“ der EDMX-Datei das EntityType-Element hinzu, wie unten dargestellt. Beachten Sie Folgendes:
    • Der Wert des Name-Attributs entspricht dem Wert des EntityType-Attributs im EntitySet-Element oben, obwohl der vollqualifizierte Name des Entitätstyps im EntityType-Attribut verwendet wird.
    • Die Eigenschaftennamen entsprechen den von der SQL-Anweisung im DefiningQuery-Element (oben) zurückgegebenen Spaltennamen.
    • In diesem Beispiel wird durch einen aus drei Eigenschaften bestehenden Entitätsschlüssel sichergestellt, dass der Schlüsselwert eindeutig ist.
    <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

Alle am Speichermodell vorgenommenen Änderungen, einschließlich der definierenden Abfragen, werden überschrieben, wenn Sie den Modellaktualisierungs-Assistenten ausführen.

 

Hinzufügen eines Entitätstyps zu dem Modell

In diesem Schritt fügen Sie den Entitätstyp mithilfe des EF Designers dem konzeptuellen Modell hinzu.  Beachten Sie Folgendes:

  • Der Name der Entität entspricht dem Wert des EntityType-Attributs im EntitySet-Element oben.
  • Die Eigenschaftennamen entsprechen den von der SQL-Anweisung im DefiningQuery-Element oben zurückgegebenen Spaltennamen.
  • In diesem Beispiel wird durch einen aus drei Eigenschaften bestehenden Entitätsschlüssel sichergestellt, dass der Schlüsselwert eindeutig ist.

Öffnen Sie das Modell im EF Designer.

  • Doppelklicken Sie auf „DefiningQueryModel.edmx“.

  • Beantworten Sie die folgende Meldung mit Ja:

    Warning 2

 

Der Entity Designer, der eine Entwurfsoberfläche zum Bearbeiten Ihres Modells bereitstellt, wird angezeigt.

  • Klicken Sie mit der rechten Maustaste auf die Designer-Oberfläche, und wählen Sie Neu hinzufügen->Entität aus.
  • Geben Sie GradeReport für den Entitätsnamen und CourseID für die Schlüssel-Eigenschaft an.
  • Klicken Sie mit der rechten Maustaste auf die Entität GradeReport, und wählen Sie Neu hinzufügen->Skalareigenschaft aus.
  • Ändern Sie den Standardnamen der Eigenschaft in FirstName.
  • Fügen Sie eine weitere skalare Eigenschaft hinzu, und geben Sie LastName für den Namen an.
  • Fügen Sie eine weitere skalare Eigenschaft hinzu, und geben Sie Grade für den Namen an.
  • Ändern Sie im Fenster Eigenschaften die Eigenschaft Typ von Grade in Dezimal.
  • Wählen Sie die Eigenschaften FirstName und LastName aus.
  • Ändern Sie im Fenster Eigenschaften den Wert der EntityKey-Eigenschaft des Steuerelements in True.

Als Ergebnis werden die folgenden Elemente dem Abschnitt CSDL der EDMX-Datei hinzugefügt.

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

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

 

Zuordnen der definierenden Abfrage zum Entitätstyp

In diesem Schritt verwenden Sie das Fenster „Mappingdetails“, um die konzeptionellen und Speicherentitätstypen zuzuordnen.

  • Klicken Sie mit der rechten Maustaste auf die GradeReport-Entität auf der Entwurfsoberfläche, und wählen Sie Tabellenmapping aus.
    Das Fenster Mappingdetails wird angezeigt.
  • Wählen Sie GradeReport in der Dropdownliste <Tabelle oder Sicht hinzufügen> (unter Tabellen) aus.
    Es werden Standardmappings zwischen dem konzeptionellen und dem Speicherentitätstyp GradeReport angezeigt.
    Mapping Details3

Als Ergebnis wird das EntitySetMapping-Element dem Mappingabschnitt der EDMX-Datei hinzugefügt. 

    <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.

 

Aufrufen der definierenden Abfrage in Ihrem Code

Sie können die definierende Abfrage jetzt mithilfe des Entitätstyps GradeReport ausführen. 

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