Share via


Erste Schritte mit Entity Framework 4.0 Database First und ASP.NET 4 Web Forms – Teil 7

von Tom Dykstra

Die Contoso University-Beispielwebanwendung veranschaulicht, wie sie ASP.NET Web Forms Anwendungen mit Entity Framework 4.0 und Visual Studio 2010 erstellen. Informationen zur Tutorialreihe finden Sie im ersten Tutorial der Reihe.

Verwenden von gespeicherten Prozeduren

Im vorherigen Tutorial haben Sie ein Vererbungsmuster für Tabellen pro Hierarchie implementiert. In diesem Tutorial erfahren Sie, wie Sie gespeicherte Prozeduren verwenden, um mehr Kontrolle über den Datenbankzugriff zu erhalten.

Mit Entity Framework können Sie angeben, dass gespeicherte Prozeduren für den Datenbankzugriff verwendet werden sollen. Für jeden Entitätstyp können Sie eine gespeicherte Prozedur angeben, die zum Erstellen, Aktualisieren oder Löschen von Entitäten dieses Typs verwendet werden soll. Anschließend können Sie im Datenmodell Verweise auf gespeicherte Prozeduren hinzufügen, die Sie zum Ausführen von Aufgaben wie dem Abrufen von Entitätssätzen verwenden können.

Die Verwendung gespeicherter Prozeduren ist eine häufige Anforderung für den Datenbankzugriff. In einigen Fällen kann ein Datenbankadministrator aus Sicherheitsgründen verlangen, dass der gesamte Datenbankzugriff gespeicherte Prozeduren durchläuft. In anderen Fällen können Sie Geschäftslogik in einige der Prozesse integrieren, die das Entity Framework beim Aktualisieren der Datenbank verwendet. Wenn beispielsweise eine Entität gelöscht wird, können Sie sie in eine Archivdatenbank kopieren. Oder wenn eine Zeile aktualisiert wird, möchten Sie möglicherweise eine Zeile in eine Protokollierungstabelle schreiben, in der aufgezeichnet wird, wer die Änderung vorgenommen hat. Sie können diese Arten von Aufgaben in einer gespeicherten Prozedur ausführen, die immer dann aufgerufen wird, wenn das Entity Framework eine Entität löscht oder eine Entität aktualisiert.

Wie im vorherigen Tutorial erstellen Sie keine neuen Seiten. Stattdessen ändern Sie die Art und Weise, wie Entity Framework für einige der bereits erstellten Seiten auf die Datenbank zugreift.

In diesem Tutorial erstellen Sie gespeicherte Prozeduren in der Datenbank zum Einfügen von Entitäten Student und Instructor . Sie fügen sie dem Datenmodell hinzu, und Sie geben an, dass das Entity Framework sie zum Hinzufügen Student von Entitäten und Instructor zur Datenbank verwenden soll. Außerdem erstellen Sie eine gespeicherte Prozedur, die Sie zum Abrufen von Course Entitäten verwenden können.

Erstellen gespeicherter Prozeduren in der Datenbank

(Wenn Sie die Datei School.mdf aus dem Projekt verwenden, das in diesem Tutorial zum Download verfügbar ist, können Sie diesen Abschnitt überspringen, da die gespeicherten Prozeduren bereits vorhanden sind.)

Erweitern Sie unter Server Explorerden Eintrag School.mdf, klicken Sie mit der rechten Maustaste auf Gespeicherte Prozeduren, und wählen Sie Neue gespeicherte Prozedur hinzufügen aus.

image15

Kopieren Sie die folgenden SQL-Anweisungen, und fügen Sie sie in das Fenster der gespeicherten Prozedur ein, und ersetzen Sie dabei die gespeicherte Prozedur.

CREATE PROCEDURE [dbo].[InsertStudent]
    @LastName nvarchar(50),
    @FirstName nvarchar(50),
    @EnrollmentDate datetime
    AS
    INSERT INTO dbo.Person (LastName, 
                FirstName, 
                EnrollmentDate)
    VALUES (@LastName, 
        @FirstName, 
        @EnrollmentDate);
    SELECT SCOPE_IDENTITY() as NewPersonID;

image14

Student -Entitäten verfügen über vier Eigenschaften: PersonID, LastName, FirstNameund EnrollmentDate. Die Datenbank generiert den ID-Wert automatisch, und die gespeicherte Prozedur akzeptiert Parameter für die anderen drei. Die gespeicherte Prozedur gibt den Wert des Datensatzschlüssels der neuen Zeile zurück, damit Entity Framework diesen in der Version der Entität nachverfolgen kann, die im Arbeitsspeicher gespeichert ist.

Speichern und schließen Sie das Fenster der gespeicherten Prozedur.

Erstellen Sie eine InsertInstructor gespeicherte Prozedur auf die gleiche Weise, indem Sie die folgenden SQL-Anweisungen verwenden:

CREATE PROCEDURE [dbo].[InsertInstructor]
        @LastName nvarchar(50),
    @FirstName nvarchar(50),
    @HireDate datetime
    AS
    INSERT INTO dbo.Person (LastName, 
                FirstName, 
                HireDate)
    VALUES (@LastName, 
        @FirstName, 
        @HireDate);
    SELECT SCOPE_IDENTITY() as NewPersonID;

Erstellen Sie Update auch gespeicherte Prozeduren für Student - und Instructor -Entitäten. (Die Datenbank verfügt bereits über eine DeletePerson gespeicherte Prozedur, die sowohl für Entitäten als auch InstructorStudent für Entitäten funktioniert.)

CREATE PROCEDURE [dbo].[UpdateStudent]
    @PersonID int,
    @LastName nvarchar(50),
    @FirstName nvarchar(50),
    @EnrollmentDate datetime
    AS
    UPDATE Person SET LastName=@LastName, 
            FirstName=@FirstName,
            EnrollmentDate=@EnrollmentDate
    WHERE PersonID=@PersonID;
CREATE PROCEDURE [dbo].[UpdateInstructor]
    @PersonID int,
    @LastName nvarchar(50),
    @FirstName nvarchar(50),
    @HireDate datetime
    AS
    UPDATE Person SET LastName=@LastName, 
            FirstName=@FirstName,
            HireDate=@HireDate
    WHERE PersonID=@PersonID;

In diesem Tutorial ordnen Sie alle drei Funktionen (Einfügen, Aktualisieren und Löschen) für jeden Entitätstyp zu. Mit Entity Framework Version 4 können Sie nur eine oder zwei dieser Funktionen gespeicherten Prozeduren zuordnen, ohne die anderen zuzuordnen, mit einer Ausnahme: Wenn Sie die Updatefunktion, aber nicht die Löschfunktion zuordnen, löst Entity Framework eine Ausnahme aus, wenn Sie versuchen, eine Entität zu löschen. In Entity Framework Version 3.5 hatten Sie nicht so viel Flexibilität beim Zuordnen gespeicherter Prozeduren: Wenn Sie eine Funktion zugeordnet haben, mussten Sie alle drei zuordnen.

Um eine gespeicherte Prozedur zu erstellen, die Daten liest und nicht aktualisiert, erstellen Sie eine, die alle Course Entitäten mit den folgenden SQL-Anweisungen auswählt:

CREATE PROCEDURE [dbo].[GetCourses]
            AS
            SELECT CourseID, Title, Credits, DepartmentID FROM dbo.Course

Hinzufügen der gespeicherten Prozeduren zum Datenmodell

Die gespeicherten Prozeduren sind jetzt in der Datenbank definiert, müssen jedoch dem Datenmodell hinzugefügt werden, um sie für Entity Framework verfügbar zu machen. Öffnen Sie SchoolModel.edmx, klicken Sie mit der rechten Maustaste auf die Entwurfsoberfläche, und wählen Sie Modell aus Datenbank aktualisieren aus. Erweitern Sie auf der Registerkarte Hinzufügen des Dialogfelds Datenbankobjekte auswählen den Eintrag Gespeicherte Prozeduren, wählen Sie die neu erstellten gespeicherten Prozeduren und die DeletePerson gespeicherte Prozedur aus, und klicken Sie dann auf Fertig stellen.

image20

Zuordnen der gespeicherten Prozeduren

Klicken Sie im Datenmodell-Designer mit der rechten Maustaste auf die Student Entität, und wählen Sie Zuordnung gespeicherter Prozeduren aus.

image21

Das Fenster Zuordnungsdetails wird angezeigt, in dem Sie gespeicherte Prozeduren angeben können, die das Entity Framework zum Einfügen, Aktualisieren und Löschen von Entitäten dieses Typs verwenden soll.

image22

Legen Sie die Insert-Funktion auf InsertStudent fest. Das Fenster zeigt eine Liste der gespeicherten Prozedurparameter an, die jeweils einer Entitätseigenschaft zugeordnet werden müssen. Zwei davon werden automatisch zugeordnet, da die Namen identisch sind. Es gibt keine Entitätseigenschaft namens FirstName, sodass Sie manuell aus einer Dropdownliste auswählen FirstMidName müssen, die verfügbare Entitätseigenschaften anzeigt. (Dies liegt daran, dass Sie den Namen der FirstName Eigenschaft im ersten Tutorial in FirstMidName geändert haben.)

image23

Ordnen Sie im selben Fenster Zuordnungsdetails die Update Funktion der UpdateStudent gespeicherten Prozedur zu (stellen Sie sicher, dass Sie wie für FirstNamedie Insert gespeicherte Prozedur als Parameterwert angebenFirstMidName) und die Delete Funktion der gespeicherten DeletePerson Prozedur zu.

image01

Führen Sie das gleiche Verfahren aus, um die gespeicherten Prozeduren für Dozenten der Instructor Entität zuzuordnen, zu aktualisieren und zu löschen.

image02

Für gespeicherte Prozeduren, die Daten lesen und nicht aktualisieren, verwenden Sie das Fenster Modellbrowser , um die gespeicherte Prozedur dem zurückgegebenen Entitätstyp zuzuordnen. Klicken Sie im Datenmodell-Designer mit der rechten Maustaste auf die Entwurfsoberfläche, und wählen Sie Modellbrowser aus. Öffnen Sie den Knoten SchoolModel.Store und dann den Knoten Gespeicherte Prozeduren . Klicken Sie dann mit der rechten Maustaste auf die GetCourses gespeicherte Prozedur, und wählen Sie Funktionsimport hinzufügen aus.

image24

Wählen Sie im Dialogfeld Funktionsimport hinzufügen unter Gibt eine Sammlung von zurück, und wählen Sie Course dann als zurückgegebener Entitätstyp aus. Wenn Sie fertig sind, klicken Sie auf OK. Speichern und schließen Sie die EDMX-Datei .

image25

Verwenden von Einfügen, Aktualisieren und Löschen gespeicherter Prozeduren

Gespeicherte Prozeduren zum Einfügen, Aktualisieren und Löschen von Daten werden automatisch vom Entity Framework verwendet, nachdem Sie sie dem Datenmodell hinzugefügt und den entsprechenden Entitäten zugeordnet haben. Sie können jetzt die Seite StudentsAdd.aspx ausführen, und jedes Mal, wenn Sie einen neuen Kursteilnehmer erstellen, verwendet Entity Framework die InsertStudent gespeicherte Prozedur, um die neue Zeile der Student Tabelle hinzuzufügen.

image03

Führen Sie die Seite Students.aspx aus , und der neue Kursteilnehmer wird in der Liste angezeigt.

image04

Ändern Sie den Namen, um zu überprüfen, ob die Updatefunktion funktioniert, und löschen Sie dann den Kursteilnehmer, um zu überprüfen, ob die Löschfunktion funktioniert.

image05

Verwenden gespeicherter Prozeduren auswählen

Das Entity Framework führt gespeicherte Prozeduren wie GetCoursesnicht automatisch aus, und Sie können sie nicht mit dem EntityDataSource -Steuerelement verwenden. Um sie zu verwenden, rufen Sie sie aus Code auf.

Öffnen Sie die Datei InstructorsCourses.aspx.cs . Die PopulateDropDownLists -Methode verwendet eine LINQ-to-Entities-Abfrage, um alle Kursentitäten abzurufen, sodass sie die Liste durchlaufen und bestimmen kann, welchen Kursleitern zugewiesen ist und welche nicht zugewiesen sind:

var allCourses = (from c in context.Courses
                  select c).ToList();

Ersetzen Sie dies durch den folgenden Code:

var allCourses = context.GetCourses();

Die Seite verwendet nun die GetCourses gespeicherte Prozedur, um die Liste aller Kurse abzurufen. Führen Sie die Seite aus, um zu überprüfen, ob sie wie zuvor funktioniert.

(Navigationseigenschaften von Entitäten, die von einer gespeicherten Prozedur abgerufen werden, werden je nach ObjectContext Standardeinstellungen möglicherweise nicht automatisch mit den Daten aufgefüllt, die sich auf diese Entitäten beziehen. Weitere Informationen finden Sie unter Laden verwandter Objekte in der MSDN Library.)

Im nächsten Tutorial erfahren Sie, wie Sie die Dynamic Data-Funktionalität verwenden, um das Programmieren und Testen von Datenformatierungs- und Validierungsregeln zu vereinfachen. Anstatt für jede Webseite Regeln wie Datenformatzeichenfolgen anzugeben und anzugeben, ob ein Feld erforderlich ist, können Sie solche Regeln in Datenmodellmetadaten angeben, die automatisch auf jede Seite angewendet werden.