Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
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 häufig verwendet, um Funktionen bereitzustellen, die mit einer Datenbankansicht vergleichbar sind, aber die Ansicht wird im Modell definiert, nicht die Datenbank. Mit einer definierenden Abfrage können Sie eine SQL-Anweisung ausführen, die im DefiningQuery-Element einer EDMX-Datei angegeben ist. Weitere Informationen finden Sie unter DefiningQuery in der SSDL-Spezifikation.
Beim Definieren von Abfragen müssen Sie auch einen Entitätstyp in Ihrem Modell definieren. Der Entitätstyp wird verwendet, um Daten anzuzeigen, die durch die definierende Abfrage verfügbar gemacht werden. Beachten Sie, dass Daten, die über diesen Entitätstyp bereitgestellt werden, schreibgeschützt sind.
Parametrisierte Abfragen können nicht als definierende Abfragen ausgeführt werden. Die Daten können jedoch aktualisiert werden, indem die Funktionen "Einfügen", "Aktualisieren" und "Löschen" des Entitätstyps zu gespeicherten Prozeduren abgebildet werden, die die Daten zugänglich machen. Weitere Informationen finden Sie unter Einfügen, Aktualisieren und Löschen mit gespeicherten Prozeduren.
In diesem Thema wird gezeigt, wie Sie die folgenden Aufgaben ausführen.
- Hinzufügen einer definierenden Abfrage
- Hinzufügen eines Entitätstyps zum Modell
- Zuordnen der definierenden Abfrage zum Entitätstyp
Voraussetzungen
Um diese exemplarische Vorgehensweise abzuschließen, benötigen Sie:
- Eine aktuelle Version von Visual Studio.
- Die Beispieldatenbank School.
Einrichten des Projekts
In dieser exemplarischen Vorgehensweise wird Visual Studio 2012 oder höher verwendet.
- Ö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 Konsolenanwendungsvorlage aus.
- Geben Sie "DefiningQuerySample " als Namen des Projekts ein, und klicken Sie auf "OK".
Erstellen eines Modells basierend auf der School-Datenbank
Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf den Projektnamen, zeigen Sie auf "Hinzufügen", und klicken Sie dann 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 " für den 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 zum Schulmodell 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 den XML-Editor (Text) aus.
Klicken Sie auf "Ja ", wenn Sie mit der folgenden Meldung aufgefordert werden:
Hinzufügen einer definierenden Abfrage
In diesem Schritt verwenden wir den XML-Editor, um eine definierende Abfrage und einen Entitätstyp zum SSDL-Abschnitt der edmx-Datei hinzuzufügen.
- Fügen Sie dem SSDL-Abschnitt der edmx-Datei (Zeile 5 bis 13) ein EntitySet-Element hinzu. Geben Sie Folgendes an:
- Es werden nur die Attribute Name und EntityType des EntitySet-Elements angegeben.
- Der vollqualifizierte Name des Entitätstyps wird im EntityType-Attribut 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 das EntityType-Element zum SSDL-Abschnitt der edmx-Datei hinzu. Datei wie unten dargestellt. Beachten Sie Folgendes:
- Der Wert des Name-Attributs entspricht dem Wert des EntityType-Attributs im obigen EntitySet-Element , obwohl der vollqualifizierte Name des Entitätstyps im EntityType-Attribut verwendet wird.
- Die Eigenschaftennamen entsprechen den Spaltennamen, die von der SQL-Anweisung im DefiningQuery-Element (oben) zurückgegeben werden.
- In diesem Beispiel besteht der Entitätsschlüssel aus drei Eigenschaften, um einen eindeutigen Schlüsselwert sicherzustellen.
<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 das Dialogfeld " Modell aktualisieren " ausführen, werden alle Änderungen, die am Speichermodell vorgenommen wurden, einschließlich der Definition von Abfragen, überschrieben.
Hinzufügen eines Entitätstyps zum Modell
In diesem Schritt fügen wir 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 obigen EntitySet-Element .
- Die Eigenschaftennamen entsprechen den Spaltennamen, die von der SQL-Anweisung im obigen DefiningQuery-Element zurückgegeben werden.
- In diesem Beispiel besteht der Entitätsschlüssel aus drei Eigenschaften, um einen eindeutigen Schlüsselwert sicherzustellen.
Öffnen Sie das Modell im EF Designer.
Doppelklicken Sie auf das DefiningQueryModel.edmx.
Sagen Sie Ja zur folgenden Nachricht:
Der Entitäts-Designer, der eine Entwurfsoberfläche zum Bearbeiten des Modells bereitstellt, wird angezeigt.
- Klicken Sie mit der rechten Maustaste auf die Designeroberfläche, und wählen Sie "Neue>Entität hinzufügen" aus.
- Geben Sie GradeReport für den Entitätsnamen und die Kurs-ID für die Key-Eigenschaft an.
- Klicken Sie mit der rechten Maustaste auf die GradeReport-Entität und wählen Sie Neue>Skalareigenschaft hinzufügen 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 Eigenschaftenfenster die Type-Eigenschaft der Klasse in "Dezimal".
- Wählen Sie die Eigenschaften "FirstName " und " LastName " aus.
- Ändern Sie im Eigenschaftenfenster den Wert der EntityKey-Eigenschaft in "True".
Daher wurden die folgenden Elemente dem CSDL-Abschnitt 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 wir das Fenster "Zuordnungsdetails", 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 "Tabellenzuordnung" aus.
Das Fenster "Zuordnungsdetails " wird angezeigt. - Wählen Sie GradeReport aus der <Dropdownliste "Tabelle oder Ansicht hinzufügen>" (unter Tabellen).
Standardzuordnungen zwischen dem konzeptionellen und dem Speicher-GradeReport-Entitätstyp werden angezeigt.
Daher wird das EntitySetMapping-Element dem Zuordnungsabschnitt 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 nun die definierende Abfrage mithilfe des GradeReport-Entitätstyps ausführen.
using (var context = new SchoolEntities())
{
var report = context.GradeReports.FirstOrDefault();
Console.WriteLine("{0} {1} got {2}",
report.FirstName, report.LastName, report.Grade);
}