{"id":55000066,"date":"2016-12-01T00:00:00","date_gmt":"2020-03-27T19:23:46","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=66"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"EDM_Ausnahmen_beim_Speichern_behandeln","status":"publish","type":"post","link":"https:\/\/vbentwickler.de\/EDM_Ausnahmen_beim_Speichern_behandeln\/","title":{"rendered":"EDM: Ausnahmen beim Speichern behandeln"},"content":{"rendered":"<p><b>Die Validierung bei der Eingabe von Daten ist eines der wichtigsten Themen bei der Erstellung benutzerfreundlicher Anwendungen. In diesem ersten Artikel zu diesem Thema wollen wir uns darauf beschr&auml;nken, solche Eingabefehler abzufangen, welche durch die Restriktionen im Datenmodell und entsprechende Fehleingaben entstehen. Das sind beispielsweise Fehler, die auftreten, weil der Benutzer keinen Wert in ein Feld eingibt, das nicht leer sein darf, oder der Datentyp des Feldes nicht mit dem eingegebenen Wert korrespondiert.<\/b><\/p>\n<h2>Beispielanwendung<\/h2>\n<p>Wie bei den meisten Artikeln dieser Ausgabe wollen wir unser Know-how an der Beispielanwendung <b>Bestellverwaltung <\/b>ausprobieren. Diese hat in einigen Tabellen Restriktionen, gegen die wir &uuml;ber die Eingabe in den beiden vorgestellten Seiten <b>Kundenuebersicht<\/b> oder <b>Artikeluebersicht <\/b>versto&szlig;en k&ouml;nnen. Das w&auml;ren beispielsweise Folgende:<\/p>\n<ul>\n<li>Das Feld <b>Bezeichnung <\/b>in der Tabelle <b>Artikel <\/b>darf nicht <b>Null <\/b>sein, muss also einen Wert enthalten.<\/li>\n<li>F&uuml;r die Fremdschl&uuml;sselfelder <b>AnredeID <\/b>der Tabelle <b>Kunden <\/b>oder <b>KategorieID <\/b>der Tabelle <b>Artikel <\/b>muss ein Wert angegeben werden.<\/li>\n<li>Andere Felder sind grunds&auml;tzlich aufgrund ihres Datentyps auf die Eingabe bestimmter Werte beschr&auml;nkt &#8211; zum Beispiel k&ouml;nnen Sie keinen Text in ein Zahlen- oder Datumsfeld eingeben.<\/li>\n<\/ul>\n<h2>Ablauf ohne Validierung<\/h2>\n<p>Schauen wir uns an, was geschieht, wenn wir keine Vorsichtsma&szlig;nahmen treffen und davon ausgehen, dass der Benutzer die korrekten Werte in die Felder eingibt und auch alle Pflichtfelder ausf&uuml;llt. Nehmen wir also an, dass der Benutzer einen neuen Artikel anlegt und vor dem Klick auf die Schaltfl&auml;che <b>Speichern <\/b>keine Bezeichnung eingibt und auch keine Kategorie ausw&auml;hlt (siehe Bild 1).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2016_06\/pic_66_001.png\" alt=\"Speichern eines Datensatzes ohne Angabe der Bezeichnung\" width=\"499,6607\" height=\"323,9245\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: Speichern eines Datensatzes ohne Angabe der Bezeichnung<\/span><\/b><\/p>\n<p>Dann liefert Visual Studio die Ausnahme aus Bild 2. Die hier angegebene Information, es sei eine Ausnahme des Typs <b>System.Data.Entity.Validation.DbEntityValidationException <\/b>liefert noch keine echte Hilfe beim Beheben des Problems.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2016_06\/pic_66_002.png\" alt=\"Ausnahme beim Versuch, Daten ohne F&uuml;llen eines Feldes zu speichern, das keine Nullwerte akzeptiert\" width=\"649,559\" height=\"488,0866\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 2: Ausnahme beim Versuch, Daten ohne F&uuml;llen eines Feldes zu speichern, das keine Nullwerte akzeptiert<\/span><\/b><\/p>\n<p>Also klicken Sie auf den Link <b>Details anzeigen&#8230; <\/b>und erhalten eine weitere Meldung, die diesmal den Hinweis <b>Fehler bei der &Uuml;berpr&uuml;fung einer oder mehrerer Entit&auml;ten<\/b> liefert. Wir erfahren noch, dass die Methode <b>SaveChanges <\/b>den Fehler ausgel&ouml;st hat, aber das war es dann auch.<\/p>\n<p>Wir k&ouml;nnen an dieser Stelle nur die Meldung ausblenden und die Ausf&uuml;hrung beenden. Selbst wenn Sie den Link <b>Ausnahmedetail in die Zwischenablage kopieren <\/b>anklicken und den Inhalt der Zwischenablage anschlie&szlig;end in einen Editor Ihrer Wahl einf&uuml;gen, erhalten Sie hier keine nennenswerten weiteren Informationen.<\/p>\n<h2>Einzelnen Fehler provozieren<\/h2>\n<p>Schauen wir uns nun an, was geschieht, wenn wir nur die <b>Bezeichnung <\/b>auslassen. In diesem Fall erhalten wir den gleichen Fehler, als wenn wir die Bezeichnung und die Kategorie weglassen. Unter Messsage erhalten wir dann, wenn wir in die Tiefe gehen, die folgende Meldung:<\/p>\n<pre>Fehler bei der &Uuml;berpr&uuml;fung einer oder mehrerer Entit&auml;ten. Weitere Informationen finden Sie in den Erl&auml;uterungen zur EntityValidationErrors-Eigenschaft.<\/pre>\n<p>Um den Fehler weiter zu untersuchen, fassen wir die SaveChanges-Methode in einen Try&#8230;Catch-Block ein, der wie folgt aussieht:<\/p>\n<pre>try {\r\n     dbContext.SaveChanges();\r\n}\r\ncatch (Exception ex) {\r\n     message = string.Format(\"Fehler: {0}\", ex.Message);\r\n     Debug.WriteLine(message);\r\n     message = string.Format(\"Typ: {0}\", ex.GetType());\r\n     Debug.WriteLine(message);\r\n}<\/pre>\n<p>Wir fangen also eine einfache Exception ab und geben im Ausgabefenster den Inhalt der Eigenschaften <b>Message <\/b>und <b>GetType <\/b>des <b>Exception<\/b>-Objekts aus. Das Ergebnis sieht wie folgt aus:<\/p>\n<pre>Fehler: Fehler bei der &Uuml;berpr&uuml;fung einer oder mehrerer Entit&auml;ten. Weitere Informationen finden Sie in den Erl&auml;uterungen zur EntityValidationErrors-Eigenschaft.\r\nTyp: System.Data.Entity.Validation.DbEntityValidationException<\/pre>\n<p>Da wir nun wissen, dass es sich um eine Exception des Typs <b>DbEntityValidationException <\/b>handelt, k&ouml;nnen wir nun gezielt diese Exception abfangen.<\/p>\n<h2>DbEntityValidationException abfangen<\/h2>\n<p>Die Abfrage der Exception <b>DbEntityValidationException <\/b>bauen wir wie in Listing 1 in die Methode <b>btnSpeichern_Click<\/b> ein. Den bestehenden <b>Catch<\/b>-Zweig mit der Standard-exception behalten wir bei, damit auch andere Fehler behandelt werden. Der neue <b>Catch<\/b>-Zweig gibt zun&auml;chst eine Meldung aus, dass ein Fehler aufgetreten ist. Dann durchl&auml;uft er in einer <b>foreach<\/b>-Schleife alle Elemente des Typs <b>DbEntityValidationResult <\/b>der Auflistung <b>EntityValidationErrors <\/b>und speichert diese in der Variablen <b>item<\/b>.<\/p>\n<pre>try {\r\n     dbContext.SaveChanges();\r\n}\r\ncatch (DbEntityValidationException ex) {\r\n     Debug.WriteLine(\"Fehler beim Speichern:\");\r\n     Debug.WriteLine(\"=====================================\");\r\n     foreach (DbEntityValidationResult item in ex.EntityValidationErrors) {\r\n         DbEntityEntry entry = item.Entry;\r\n         string entityTypeName = entry.Entity.GetType().Name;\r\n         foreach (DbValidationError subItem in item.ValidationErrors) {\r\n             string message = string.Format(\"Fehlerbeschreibung: ''{0}''\", subItem.ErrorMessage);\r\n             Debug.WriteLine(message);\r\n             message = string.Format(\"Tabelle\/Entit&auml;t: {0}\", entityTypeName);\r\n             Debug.WriteLine(message);\r\n             message = string.Format(\"Feld\/Eigenschaft: {0}\", subItem.PropertyName);\r\n             Debug.WriteLine(message);\r\n         }\r\n     }\r\n     Debug.WriteLine(\"=====================================\");\r\n}<\/pre>\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\/55000066\/\">\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\/55000066?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\t\t\t\t\t<input type=\"hidden\" name=\"rcp_redirect\" value=\"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000066\/\"\/>\n\t\t\t\t\t\t\t\t<input type=\"hidden\" name=\"rcp_login_nonce\" value=\"05094fc278\"\/>\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>Die Validierung bei der Eingabe von Daten ist eines der wichtigsten Themen bei der Erstellung benutzerfreundlicher Anwendungen. In diesem ersten Artikel zu diesem Thema wollen wir uns darauf beschr&auml;nken, solche Eingabefehler abzufangen, welche durch die Restriktionen im Datenmodell und entsprechende Fehleingaben entstehen. Das sind beispielsweise Fehler, die auftreten, weil der Benutzer keinen Wert in ein Feld eingibt, dass nicht leer sein darf oder der Datentyp des Feldes nicht mit dem eingegebenen Wert korrespondiert.<\/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":[662016,66062016,44000008,44000021,44000026,44000023],"tags":[],"yst_prominent_words":[],"class_list":["post-55000066","post","type-post","status-publish","format-standard","hentry","category-662016","category-66062016","category-Datenzugriffstechnik","category-Entity_Framework","category-Outlook_programmieren","category-PowerApps"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000066","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=55000066"}],"version-history":[{"count":0,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000066\/revisions"}],"wp:attachment":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/media?parent=55000066"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/categories?post=55000066"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/tags?post=55000066"},{"taxonomy":"yst_prominent_words","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/yst_prominent_words?post=55000066"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}