Entity Framework: Gespeicherte Prozeduren

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

Festlegen eines Spaltenfilters

Bild 1: Festlegen eines Spaltenfilters

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

Auswahl der zu filternden SQL-Aktionen

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.

SQL-Anweisung zum Ändern eines Datensatzes

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.

Bitte geben Sie die Zeichenfolge in das nachfolgende Textfeld ein

Die mit einem * markierten Felder sind Pflichtfelder.

Ich habe die Datenschutzbestimmungen zur Kenntnis genommen.