{"id":55000167,"date":"2019-02-01T00:00:00","date_gmt":"2020-03-27T19:36:21","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=167"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Entity_Framework_Gespeicherte_Prozeduren","status":"publish","type":"post","link":"https:\/\/vbentwickler.de\/Entity_Framework_Gespeicherte_Prozeduren\/","title":{"rendered":"Entity Framework: Gespeicherte Prozeduren"},"content":{"rendered":"<p><b>Entity Framework bietet die M&ouml;glichkeit, mit einer Datenbank zu arbeiten, die lediglich einfache Tabellen enth&auml;lt. Sie k&ouml;nnten so s&auml;mtliche Gesch&auml;ftslogik in der Anwendung halten. Manch einer mag aber vielleicht Teile der Gesch&auml;ftslogik in die Datenbank &uuml;berf&uuml;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&auml;nderungen automatisch ausgel&ouml;st werden, ein anderes sind gespeicherte Prozeduren, &uuml;ber die sie sowohl Daten abfragen als auch anlegen, &auml;ndern oder l&ouml;schen k&ouml;nnen. Dieser Artikel besch&auml;ftigt sich mit den gespeicherten Prozeduren und den M&ouml;glichkeiten, die sich unter Entity Framework zu ihrer Nutzung bieten.<\/b><\/p>\n<p>Wenn Sie ein Objekt in Entity Framework anlegen wollen, erstellen Sie das Objekt neu und rufen die <b>Add<\/b>-Methode des jeweiligen DbSets auf. Der anschlie&szlig;ende Aufruf der <b>SaveChanges<\/b>-Methode sorgt dann f&uuml;r das &Uuml;bertragen der &Auml;nderung in der lokalen Auflistung in die Datenbank. Wenn Sie Eigenschaften eines Objekts &auml;ndern, &uuml;bertragen Sie die &Auml;nderungen ebenfalls mit der <b>SaveChanges<\/b>-Methode. Und das geschieht auch, wenn Sie ein Element etwa mit der <b>Remove<\/b>-Methode entfernt haben &#8211; erst die <b>SaveChanges<\/b>-Methode l&ouml;scht den entsprechenden Datensatz aus der zugrundeliegenden Tabelle.<\/p>\n<h2>Ausf&uuml;hrung gespeicherte Prozeduren unter LINQ beobachten<\/h2>\n<p>Im Hintergrund f&uuml;hrt die Anwendung entsprechende SQL-Anweisungen aus, wovon wir uns leicht &uuml;berzeugen k&ouml;nnen, wenn wir den SQL Server Profiler mitlaufen lassen. Die grundlegende Bedienung erl&auml;utern wir im Artikel <b>SQL Server-Interaktion mit dem Profiler verfolgen <\/b>in Ausgabe 4\/2016.<\/p>\n<p>In unserem Fall wollen wir f&uuml;r die aktuelle Datenbank, deren ID wir im SQL Server Management Studio mit der folgenden Abfrage f&uuml;r die Zieldatenbank ermitteln, die ausgef&uuml;hrten SQL-Anweisungen anzeigen lassen:<\/p>\n<pre>SELECT DB_ID()<\/pre>\n<p>Das Ergebnis lautet beispielsweise <b>40<\/b>. In den Ablaufverfolgungseigenschaften des SQL Server Profilers aktivieren Sie die Option <b>Alle Spalten anzeigen<\/b>. Dann k&ouml;nnen Sie nach einem Klick auf <b>Spaltenfilter <\/b>im Dialog <b>Filter bearbeiten <\/b>einen Filter f&uuml;r die Eigenschaft <b>DatabaseID <\/b>festlegen, und zwar auf den oben ermitteln Wert, in unserem Fall <b>40 <\/b>(siehe Bild 1).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2019_01\/pic_167_002.png\" alt=\"Festlegen eines Spaltenfilters\" width=\"424,7115\" height=\"338,922\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: Festlegen eines Spaltenfilters<\/span><\/b><\/p>\n<p>Danach aktivieren Sie noch die Option <b>Alle Ereignisse anzeigen <\/b>und selektieren dann im Bereich <b>Ereignisauswahl <\/b>das Ereignis <b>Stored Procedures|RCP: Completed <\/b>(siehe Bild 2). Damit legen wir fest, dass alle per Remote ausgef&uuml;hrten Abfragen vom Profiler erfasst und ausgegeben werden.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2019_01\/pic_167_001.png\" alt=\"Auswahl der zu filternden SQL-Aktionen\" width=\"700\" height=\"448,3988\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 2: Auswahl der zu filternden SQL-Aktionen<\/span><\/b><\/p>\n<h2>Beispielprojekt vorbereiten<\/h2>\n<p>Als Beispielprojekt verwenden wir ein Projekt auf Basis der Vorlage <b>Visual Basic|Windows Desktop|WPF App<\/b>. Dieser f&uuml;gen wir mit den Methoden aus dem Artikel <b>Von Access zu EF: Step by step <\/b>aus Ausgabe 5\/2018, erweitert um die Informationen aus <b>Von Access zu EF: Update 1 <\/b>aus der vorliegenden Ausgabe, ein Entity Data Model hinzu, aus dem wir dann eine entsprechende SQL Server-Datenbank generieren.<\/p>\n<h2>Automatisch generierte gespeicherte Prozedur ermitteln<\/h2>\n<p>Um zu erkennen, welche gespeicherten Prozeduren im Hintergrund ausgef&uuml;hrt werden, wenn wir Daten &auml;ndern, l&ouml;schen oder hinzuf&uuml;gen, legen wir f&uuml;r das Fenster <b>MainWindow.xaml <\/b>einen Konstruktor in der Code behind-Klasse an, den wir wie folgt ausstatten.<\/p>\n<p>Wir deklarieren dort einen Datenbankkontext namens <b>dbContext <\/b>und f&uuml;llen diesen mit einer neuen Instanz unserer Datenbankkontext-Klasse <b>BestellverwaltungContext<\/b>:<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>New()\r\n     <span style=\"color:blue;\">Dim <\/span>dbContext<span style=\"color:blue;\"> As <\/span>BestellverwaltungContext\r\n     <span style=\"color:blue;\">Dim <\/span>Kunde<span style=\"color:blue;\"> As <\/span>Kunde\r\n     dbContext = <span style=\"color:blue;\">New<\/span> BestellverwaltungContext<\/pre>\n<p>Dann weisen wir der Objektvariablen <b>Kunde <\/b>den ersten Kunden zu, den wir in der Tabelle <b>Kunden <\/b>finden, bearbeiten die Eigenschaft <b>Firma <\/b>des Kunden und speichern die &Auml;nderung durch den Aufruf der Methode <b>SaveChanges<\/b>:<\/p>\n<pre>     Kunde = dbContext.Kunden.First\r\n     Kunde.Firma = Kunde.Firma + \"1\"\r\n     dbContext.SaveChanges()<\/pre>\n<p>Dann entfernen wir diesen Kunden und speichern die &Auml;nderungen ebenfalls mit <b>SaveChanges<\/b>:<\/p>\n<pre>     dbContext.Kunden.Remove(Kunde)\r\n     dbContext.SaveChanges()<\/pre>\n<p>Schlie&szlig;lich legen wir noch einen neuen Kunden an, f&uuml;gen das <b>Kunde<\/b>-Element zur Auflistung der Kunden mit der <b>Add<\/b>-Methode hinzu und speichern die &Auml;nderungen mit <b>SaveChanges<\/b>:<\/p>\n<pre>     Kunde = <span style=\"color:blue;\">New<\/span> Kunde <span style=\"color:blue;\">With<\/span> {.Firma = \"Firma\", .AnredeID = 1, .Vorname = \"Klaus\", .Nachname = \"M&uuml;ller\", _\r\n         .EMail = \"klaus@mueller.de\", .Land = \"Deutschland\", .Ort = \"Testhausen\", .PLZ = \"11111\", .Strasse = \"Teststr. 1\"}\r\n     dbContext.Kunden.Add(Kunde)\r\n     dbContext.SaveChanges()\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Bevor wir die Anwendung &ouml;ffnen, starten wir den SQL Server Profiler mit den obigen Einstellungen. Setzen Sie einen Haltepunkt in die erste Zeile mit der Anweisung <b>dbContext.SaveChanges<\/b>. Dann starten Sie die Anwendung. Nachdem der Haltepunkt erreicht ist, lassen Sie durch Bet&auml;tigen der Taste <b>F11 <\/b>die <b>SaveChanges<\/b>-Methode ausf&uuml;hren und schauen sich das Ergebnis im SQL Server Profiler an. Hier finden Sie die SQL-Anweisung mit dem <b>UPDATE<\/b>-Schl&uuml;sselwort aus Bild 3 vor.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2019_01\/pic_167_003.png\" alt=\"SQL-Anweisung zum &Auml;ndern eines Datensatzes\" width=\"549,6265\" height=\"260,4614\"\/><\/p>\n<div class=\"rcp_restricted\"><p><span style=\"color: #ff0000;\">M&ouml;chten Sie weiterlesen? Dann l&ouml;sen Sie Ihr Ticket!<\/span><br \/>\n<span style=\"color: #ff0000;\">Hier geht es zur Bestellung des Jahresabonnements des Magazins <strong>Visual Basic Entwickler<\/strong>:<\/span><br \/>\n<span style=\"color: #ff0000;\"><a style=\"color: #ff0000;\" href=\"https:\/\/shop.minhorst.com\/magazine\/363\/visual-basic-entwickler-jahresabonnement?c=77\">Zur Bestellung ...<\/a><\/span><br \/>\n<span style=\"color: #ff0000;\">Danach greifen Sie sofort auf <strong>alle rund 200 Artikel<\/strong> unseres Angebots zu - auch auf diesen hier!<\/span><br \/>\n<span style=\"color: #000000;\">Oder haben Sie bereits Zugangsdaten? Dann loggen Sie sich gleich hier ein:<\/span><\/p>\n<\/div>\n\n\t\n\t<form id=\"rcp_login_form\"  class=\"rcp_form\" method=\"POST\" action=\"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000167\/\">\n\n\t\t\n\t\t<fieldset class=\"rcp_login_data\">\n\t\t\t<p>\n\t\t\t\t<label for=\"rcp_user_login\">Username or Email<\/label>\n\t\t\t\t<input name=\"rcp_user_login\" id=\"rcp_user_login\" class=\"required\" type=\"text\"\/>\n\t\t\t<\/p>\n\t\t\t<p>\n\t\t\t\t<label for=\"rcp_user_pass\">Password<\/label>\n\t\t\t\t<input name=\"rcp_user_pass\" id=\"rcp_user_pass\" class=\"required\" type=\"password\"\/>\n\t\t\t<\/p>\n\t\t\t\t\t\t<p>\n\t\t\t\t<input type=\"checkbox\" name=\"rcp_user_remember\" id=\"rcp_user_remember\" value=\"1\"\/>\n\t\t\t\t<label for=\"rcp_user_remember\">Remember me<\/label>\n\t\t\t<\/p>\n\t\t\t<p class=\"rcp_lost_password\"><a href=\"\/data\/wp\/v2\/posts\/55000167?rcp_action=lostpassword\"><\/a><\/p>\n\t\t\t<p>\n\t\t\t\t<input type=\"hidden\" name=\"rcp_action\" value=\"login\"\/>\n\t\t\t\t<input type=\"hidden\" name=\"rcp_redirect\" value=\"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000167\/\"\/>\n\t\t\t\t<input type=\"hidden\" name=\"rcp_login_nonce\" value=\"dbce743e9d\"\/>\n\t\t\t\t<input id=\"rcp_login_submit\" class=\"rcp-button\" type=\"submit\" value=\"Login\"\/>\n\t\t\t<\/p>\n\t\t\t\t\t<\/fieldset>\n\n\t\t\n\t<\/form>\n<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Entity Framework bietet die M&ouml;glichkeit, mit einer Datenbank zu arbeiten, die lediglich einfache Tabellen enth&auml;lt. Sie k&ouml;nnten so s&auml;mtliche Gesch&auml;ftslogik in der Anwendung halten. Manch einer mag aber vielleicht Teile der Gesch&auml;ftslogik in die Datenbank &uuml;berf&uuml;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&auml;nderungen automatisch ausgel&ouml;st werden, ein anderes sind gespeicherte Prozeduren, &uuml;ber die sie sowohl Daten abfragen als auch anlegen, &auml;ndern oder l&ouml;schen k&ouml;nnen. Dieser Artikel besch&auml;ftigt sich mit den gespeicherten Prozeduren und den M&ouml;glichkeiten, die sich unter Entity Framework zu ihrer Nutzung bieten.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"om_disable_all_campaigns":false,"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"_uf_show_specific_survey":0,"_uf_disable_surveys":false,"footnotes":""},"categories":[66012019,662019,44000021,44000006],"tags":[],"yst_prominent_words":[],"class_list":["post-55000167","post","type-post","status-publish","format-standard","hentry","category-66012019","category-662019","category-Entity_Framework","category-SQL_Server_und_Co"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000167","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/comments?post=55000167"}],"version-history":[{"count":0,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000167\/revisions"}],"wp:attachment":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/media?parent=55000167"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/categories?post=55000167"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/tags?post=55000167"},{"taxonomy":"yst_prominent_words","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/yst_prominent_words?post=55000167"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}