Wenn Sie ein Abonnement des Magazins 'DATENBANKENTWICKLER' besitzen, können Sie sich anmelden und den kompletten Artikel lesen.
Anderenfalls können Sie das Abonnement hier im Shop erwerben.
Entity Framework: Gespeicherte Prozeduren
Entity Framework bietet die Möglichkeit, mit einer Datenbank zu arbeiten, die lediglich einfache Tabellen enthält. Sie könnten so sämtliche Geschäftslogik in der Anwendung halten. Manch einer mag aber vielleicht Teile der Geschäftslogik in die Datenbank überführen oder, wenn die Datenbank schon existiert, dort belassen, damit diese von verschiedenen Anwendungen aus genutzt werden kann. Ein Beispiel sind Trigger, die bei Datenänderungen automatisch ausgelöst werden, ein anderes sind gespeicherte Prozeduren, über die sie sowohl Daten abfragen als auch anlegen, ändern oder löschen können. Dieser Artikel beschäftigt sich mit den gespeicherten Prozeduren und den Möglichkeiten, die sich unter Entity Framework zu ihrer Nutzung bieten.
Wenn Sie ein Objekt in Entity Framework anlegen wollen, erstellen Sie das Objekt neu und rufen die Add-Methode des jeweiligen DbSets auf. Der anschließende Aufruf der SaveChanges-Methode sorgt dann für das Übertragen der Änderung in der lokalen Auflistung in die Datenbank. Wenn Sie Eigenschaften eines Objekts ändern, übertragen Sie die Änderungen ebenfalls mit der SaveChanges-Methode. Und das geschieht auch, wenn Sie ein Element etwa mit der Remove-Methode entfernt haben – erst die SaveChanges-Methode löscht den entsprechenden Datensatz aus der zugrundeliegenden Tabelle.
Ausführung gespeicherte Prozeduren unter LINQ beobachten
Im Hintergrund führt die Anwendung entsprechende SQL-Anweisungen aus, wovon wir uns leicht überzeugen können, wenn wir den SQL Server Profiler mitlaufen lassen. Die grundlegende Bedienung erläutern wir im Artikel SQL Server-Interaktion mit dem Profiler verfolgen in Ausgabe 4/2016.
In unserem Fall wollen wir für die aktuelle Datenbank, deren ID wir im SQL Server Management Studio mit der folgenden Abfrage für die Zieldatenbank ermitteln, die ausgeführten SQL-Anweisungen anzeigen lassen:
SELECT DB_ID()
Das Ergebnis lautet beispielsweise 40. In den Ablaufverfolgungseigenschaften des SQL Server Profilers aktivieren Sie die Option Alle Spalten anzeigen. Dann können Sie nach einem Klick auf Spaltenfilter im Dialog Filter bearbeiten einen Filter für die Eigenschaft DatabaseID festlegen, und zwar auf den oben ermitteln Wert, in unserem Fall 40 (siehe Bild 1).
Bild 1: Festlegen eines SpaltenfiltersDanach aktivieren Sie noch die Option Alle Ereignisse anzeigen und selektieren dann im Bereich Ereignisauswahl das Ereignis Stored Procedures|RCP: Completed (siehe Bild 2). Damit legen wir fest, dass alle per Remote ausgeführten Abfragen vom Profiler erfasst und ausgegeben werden.
Bild 2: Auswahl der zu filternden SQL-Aktionen
Beispielprojekt vorbereiten
Als Beispielprojekt verwenden wir ein Projekt auf Basis der Vorlage Visual Basic|Windows Desktop|WPF App. Dieser fügen wir mit den Methoden aus dem Artikel Von Access zu EF: Step by step aus Ausgabe 5/2018, erweitert um die Informationen aus Von Access zu EF: Update 1 aus der vorliegenden Ausgabe, ein Entity Data Model hinzu, aus dem wir dann eine entsprechende SQL Server-Datenbank generieren.
Automatisch generierte gespeicherte Prozedur ermitteln
Um zu erkennen, welche gespeicherten Prozeduren im Hintergrund ausgeführt werden, wenn wir Daten ändern, löschen oder hinzufügen, legen wir für das Fenster MainWindow.xaml einen Konstruktor in der Code behind-Klasse an, den wir wie folgt ausstatten.
Wir deklarieren dort einen Datenbankkontext namens dbContext und füllen diesen mit einer neuen Instanz unserer Datenbankkontext-Klasse BestellverwaltungContext:
Public Sub New()
Dim dbContext As BestellverwaltungContext
Dim Kunde As Kunde
dbContext = New BestellverwaltungContext
Dann weisen wir der Objektvariablen Kunde den ersten Kunden zu, den wir in der Tabelle Kunden finden, bearbeiten die Eigenschaft Firma des Kunden und speichern die Änderung durch den Aufruf der Methode SaveChanges:
Kunde = dbContext.Kunden.First
Kunde.Firma = Kunde.Firma + "1"
dbContext.SaveChanges()
Dann entfernen wir diesen Kunden und speichern die Änderungen ebenfalls mit SaveChanges:
dbContext.Kunden.Remove(Kunde)
dbContext.SaveChanges()
Schließlich legen wir noch einen neuen Kunden an, fügen das Kunde-Element zur Auflistung der Kunden mit der Add-Methode hinzu und speichern die Änderungen mit SaveChanges:
Kunde = New Kunde With {.Firma = "Firma", .AnredeID = 1, .Vorname = "Klaus", .Nachname = "Müller", _
.EMail = "klaus@mueller.de", .Land = "Deutschland", .Ort = "Testhausen", .PLZ = "11111", .Strasse = "Teststr. 1"}
dbContext.Kunden.Add(Kunde)
dbContext.SaveChanges()
End Sub
Bevor wir die Anwendung öffnen, starten wir den SQL Server Profiler mit den obigen Einstellungen. Setzen Sie einen Haltepunkt in die erste Zeile mit der Anweisung dbContext.SaveChanges. Dann starten Sie die Anwendung. Nachdem der Haltepunkt erreicht ist, lassen Sie durch Betätigen der Taste F11 die SaveChanges-Methode ausführen und schauen sich das Ergebnis im SQL Server Profiler an. Hier finden Sie die SQL-Anweisung mit dem UPDATE-Schlüsselwort aus Bild 3 vor.
Bild 3: SQL-Anweisung zum Ändern eines Datensatzes
Die gespeicherte Prozedur, die für den zweiten SaveChanges-Aufruf nach dem Entfernen eines der Elemente ausgeführt wird, lautet wie folgt und enthält erwartungsgemäß das DELETE-Schlüsselwort:
exec sp_executesql N'DELETE [dbo].[Kunden]
WHERE ([ID] = @0)',N'@0 int',@0=4
Fehlt noch die letzte SQL-Anweisung zum Anlegen eines Datensatzes nach dem Hinzufügen eines neuen Kunde-Objekts:
exec sp_executesql N'INSERT [dbo].[Kunden]([Firma], [Vorname], [Nachname], [AnredeID], [Strasse], [PLZ], [Ort], [Land], [EMail])
Dies war die Leseprobe dieses Artikels.
Melden Sie sich an, um auf den vollständigen Artikel zuzugreifen.