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.
Von Tom Dykstra
Die Contoso University-Beispielwebanwendung veranschaulicht, wie ASP.NET Web Forms-Anwendungen mithilfe von Entity Framework 4.0 und Visual Studio 2010 erstellt werden. Informationen zur Lernprogrammreihe finden Sie im ersten Lernprogramm in der Reihe
Verwenden gespeicherter Prozeduren
Im vorherigen Lernprogramm haben Sie ein Vererbungsmuster für Tabellen pro Hierarchie implementiert. In diesem Lernprogramm 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, mit denen Sie Aufgaben wie das Abrufen von Gruppen von Entitäten ausführen können.
Die Verwendung gespeicherter Prozeduren ist eine häufige Anforderung für den Datenbankzugriff. In einigen Fällen erfordert ein Datenbankadministrator möglicherweise, dass der gesamte Datenbankzugriff aus Sicherheitsgründen gespeicherte Prozeduren durchlaufen muss. In anderen Fällen möchten Sie möglicherweise Geschäftslogik in einige der Prozesse erstellen, die das Entity Framework verwendet, wenn sie die Datenbank aktualisiert. 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 aufgerufen wird, wenn das Entity Framework eine Entität löscht oder eine Entität aktualisiert.
Wie im vorherigen Lernprogramm erstellen Sie keine neuen Seiten. Stattdessen ändern Sie die Art und Weise, wie das Entity Framework für einige der bereits erstellten Seiten auf die Datenbank zugreift.
In diesem Tutorial erstellen Sie Stored Procedures in der Datenbank zum Einfügen von Student und Instructor Entitäten. Sie fügen sie dem Datenmodell hinzu, damit das Entity Framework sie zum Hinzufügen von Student- und Instructor-Entitäten zur Datenbank verwendet. Sie erstellen auch eine gespeicherte Prozedur, die Sie zum Abrufen von Course Entitäten verwenden können.
Erstellen gespeicherter Prozeduren in der Datenbank
(Wenn Sie die School.mdf Datei aus dem Projekt verwenden, das mit diesem Lernprogramm heruntergeladen werden kann, können Sie diesen Abschnitt überspringen, da die gespeicherten Prozeduren bereits vorhanden sind.)
Erweitern Sie im Server-ExplorerSchool.mdf, klicken Sie mit der rechten Maustaste auf gespeicherte Prozeduren, und wählen Sie "Neue gespeicherte Prozedur hinzufügen" aus.
Kopieren Sie die folgenden SQL-Anweisungen und fügen Sie sie in das Fenster der gespeicherten Prozedur ein, um die bisherige Prozedur zu ersetzen.
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;
Student Entitäten weisen vier Eigenschaften auf: PersonID, , LastName, FirstNameund EnrollmentDate. Die Datenbank generiert automatisch den ID-Wert, 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 das Entity Framework dies in der Version der Entität nachverfolgen kann, die er im Arbeitsspeicher behält.
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 gespeicherte Prozeduren auch für Student und die Instructor Entitäten. (Die Datenbank verfügt bereits über eine Prozedur DeletePerson, die sowohl für die Entitäten Instructor als auch für Student 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. Wenn Sie die Updatefunktion, aber nicht die Löschfunktion zuordnen, löst das Entity Framework eine Ausnahme aus, wenn Sie versuchen, eine Entität zu löschen. In der Entity Framework-Version 3.5 haben Sie bei der Zuordnung gespeicherter Prozeduren nicht so viel Flexibilität: Wenn Sie eine Funktion zugeordnet haben, mussten Sie alle drei zuordnen.
Um eine gespeicherte Prozedur zu erstellen, die statt Daten zu aktualisieren, Daten liest, erstellen Sie eine, die alle Course Entitäten auswählt, indem Sie die folgenden SQL-Anweisungen verwenden:
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 dem Entity Framework zur Verfügung zu stellen. Ö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 " im Dialogfeld " 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".
Zuordnen der gespeicherten Prozeduren
Klicken Sie im Datenmodell-Designer mit der rechten Maustaste auf die Student Entität, und wählen Sie " Gespeicherte Prozedurzuordnung" aus.
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.
Legen Sie die Insert-Funktion auf InsertStudent fest. Das Fenster zeigt eine Liste mit gespeicherten Prozedurparametern, von denen jede einer Entitätseigenschaft zugeordnet werden muss. Zwei davon werden automatisch zugeordnet, da die Namen identisch sind. Es gibt keine Entitätseigenschaft namens FirstName, daher müssen Sie manuell aus einer Dropdownliste auswählen FirstMidName , in der verfügbare Entitätseigenschaften angezeigt werden. (Dies liegt daran, dass Sie den Namen der Eigenschaft FirstName auf FirstMidName im ersten Tutorial geändert haben.)
Im selben Zuordnungsdetails Fenster ordnen Sie die Update Funktion der UpdateStudent gespeicherten Prozedur zu (stellen Sie sicher, dass Sie FirstMidName als Parameterwert für die FirstName gespeicherte Prozedur angeben, wie Sie es für die Insert gespeicherte Prozedur gemacht haben) und die Delete Funktion der DeletePerson gespeicherten Prozedur zu.
Befolgen Sie dasselbe Verfahren, um die gespeicherten Prozeduren für Kursleiter auf die Entität Instructor abzubilden: einfügen, aktualisieren und löschen.
Bei gespeicherten 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 öffnen Sie 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.
Für das Dialogfeld "Funktionsimport hinzufügen", wählen Sie unter "Rückgabe als Auflistung von"Entitäten und wählen Sie dann Course als zurückgegebenen Entitätstyp aus. Wenn Sie fertig sind, klicken Sie auf "OK". Speichern und schließen Sie die EDMX-Datei .
Verwenden von "Gespeicherte Prozeduren einfügen", "Aktualisieren" und "Löschen von gespeicherten Prozeduren"
Gespeicherte Prozeduren zum Einfügen, Aktualisieren und Löschen von Daten werden vom Entity Framework automatisch verwendet, nachdem Sie sie dem Datenmodell hinzugefügt und den entsprechenden Entitäten zugeordnet haben. Sie können jetzt die StudentsAdd.aspx-Seite ausführen, und jedes Mal, wenn Sie einen neuen Kursteilnehmer erstellen, verwendet Das Entity Framework die InsertStudent gespeicherte Prozedur, um die neue Zeile zur Student Tabelle hinzuzufügen.
Führen Sie die seite Students.aspx aus, und der neue Kursteilnehmer wird in der Liste angezeigt.
Ändern Sie den Namen, um zu überprüfen, ob die Aktualisierungsfunktion funktioniert, und löschen Sie dann den Kursteilnehmer, um zu überprüfen, ob die Löschfunktion funktioniert.
"Auswählen von gespeicherten Prozeduren"
Das Entity Framework führt keine gespeicherten Prozeduren wie GetCoursesz. B. aus, und Sie können sie nicht mit dem EntityDataSource Steuerelement verwenden. Um sie zu verwenden, rufen Sie sie aus dem Code auf.
Öffnen Sie die InstructorsCourses.aspx.cs Datei. Die PopulateDropDownLists-Methode verwendet eine LINQ-to-Entities-Abfrage, um alle Kursentitäten abzurufen, sodass sie die Liste durchlaufen und bestimmen kann, welchen Kursen ein Kursleiter zugewiesen ist und welche Kurse 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 im Zusammenhang mit diesen Entitäten aufgefüllt. Weitere Informationen finden Sie unter Laden verwandter Objekte in der MSDN Library.)
Im nächsten Lernprogramm erfahren Sie, wie Sie dynamische Datenfunktionen verwenden, um das Programmieren und Testen von Datenformatierungen 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 und automatisch auf jede Seite angewendet werden.