{"id":55000271,"date":"2021-10-01T00:00:00","date_gmt":"2022-02-15T13:16:38","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=271"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Seminarverwaltung_I_Entity_Data_Model","status":"publish","type":"post","link":"https:\/\/vbentwickler.de\/Seminarverwaltung_I_Entity_Data_Model\/","title":{"rendered":"Seminarverwaltung I: Entity Data Model"},"content":{"rendered":"<p><b>Es wird Zeit, die gelernten Techniken mal wieder an einer praktischen L&ouml;sung auszuprobieren. In diesem Fall soll es eine Anwendung werden, die ich selbst einsetzen will, da ich seit ein paar Wochen auch Webinare zu verschiedenen Themen anbiete. Die Herausforderung ist, die Kunden, die &uuml;ber einen Onlineshop bestellt haben, in die Anwendung einzulesen und diese den entsprechenden Seminaren beziehungsweise Webinaren zuzuordnen. Zu gegebener Zeit sollen die Teilnehmer eine Mail mit dem Link zur Teamssitzung erhalten und anschlie&szlig;end noch einen Link mit dem Download der Aufzeichnung des Seminars. Schlie&szlig;lich sollen auch noch Zertifikate &uuml;ber die Teilnahme erstellt und versendet werden. Wie dies alles gelingt, zeigt der vorliegende Artikel.<\/b><\/p>\n<h2>Projekt anlegen<\/h2>\n<p>Die Gestaltung einer Anwendung zum Verwalten von Daten startet mit dem Anlegen eines Projekts. Wir verwenden ein Projekt des Typs <b>WPF-App (.NET Framework) <\/b>mit der Sprache Visual Basic und auf Basis von XAML f&uuml;r die Gestaltung der Benutzeroberfl&auml;che.<\/p>\n<h2>Entity Data Model hinzuf&uuml;gen<\/h2>\n<p>Wir wollen die Daten in einer SQL Server-Datenbank speichern und &uuml;ber ein Entity Data Model auf diese Daten zugreifen. Dazu f&uuml;gen wir dem Projekt ein Entity Data Model hinzu. Mit <b>Strg + Umschalt + A <\/b>&ouml;ffnen wir den Dialog <b>Neues Element hinzuf&uuml;gen <\/b>und w&auml;hlen dort den Eintrag <b>ADO.NET Entity Data Model <\/b>aus. Nach der Angabe des Namens <b>SeminarverwaltungContext <\/b>klicken wir auf die Schaltfl&auml;che <b>Hinzuf&uuml;gen<\/b> (siehe Bild 1).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2021_05\/pic_271_001.png\" alt=\"Hinzuf&uuml;gen eines Entity Data Models\" width=\"700\" height=\"346,1956\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: Hinzuf&uuml;gen eines Entity Data Models<\/span><\/b><\/p>\n<p>Danach w&auml;hlen Sie im Dialog <b>Assistent f&uuml;r Entity Data Model <\/b>den Eintrag <b>Leeres Code First-Modell <\/b>aus (siehe Bild 2).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2021_05\/pic_271_002.png\" alt=\"Auswahl des Model-Typs\" width=\"649,627\" height=\"441,8727\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 2: Auswahl des Model-Typs<\/span><\/b><\/p>\n<p>Nach wenigen Sekunden erscheint die Klasse <b>SeminarverwaltungContext<\/b>, in der wir f&uuml;r jede zu erstellende Entit&auml;t beziehungsweise Tabelle einen Eintrag hinzuf&uuml;gen. Hier finden wir auch eine Vorlage f&uuml;r eine Entit&auml;tsklasse.<\/p>\n<h2>Entit&auml;ten hinzuf&uuml;gen<\/h2>\n<p>Damit k&ouml;nnen wir beginnen, die gew&uuml;nschten Entit&auml;ten hinzuzuf&uuml;gen. Dazu &uuml;berlegen wir uns zun&auml;chst, welche Entit&auml;ten wir ben&ouml;tigen. Wir ben&ouml;tigen auf jeden Fall eine Entit&auml;t f&uuml;r die Kunden und eine f&uuml;r die Seminare. Jedem Kunden soll jedes Seminar zugeordnet werden k&ouml;nnen und umgekehrt. Daher soll sp&auml;ter in der Datenbank eine Verkn&uuml;pfungstabelle erscheinen. Damit dies geschieht, ben&ouml;tigen wir keine eigene Entit&auml;t f&uuml;r die Verkn&uuml;pfungstabelle &#8211; die Beziehungstabelle erstellen wir dann &uuml;ber ein spezielles Mapping.<\/p>\n<p>Die Kunden haben eine Anrede, die wir in einer eigenen Tabelle speichern und dann &uuml;ber ein Fremdschl&uuml;sselfeld zuweisen wollen, also legen wir auch eine entsprechende Entit&auml;t f&uuml;r die Anreden an.<\/p>\n<p>Au&szlig;erdem ben&ouml;tigen wir zumindest eine Tabelle zur Verwaltung der Seminare. An dieser Stelle kann man sich gleich &uuml;berlegen, ob es nur eine Tabelle zum Speichern der Seminare gibt. Dann muss man Seminare mit Themen, die nochmal wiederholt werden sollen, immer wieder komplett neu anlegen. Man k&ouml;nnte auch eine Tabelle mit Seminaren erstellen, welche die Basisinformationen eines Seminars enth&auml;lt wie den Titel, die Inhaltsangabe, den Preis et cetera &#8211; beispielsweise namens <b>Seminarthemen<\/b>.<\/p>\n<p>Und dann f&uuml;gt man eine neue Tabelle beispielsweise namens <b>Seminare <\/b>hinzu, welche die Seminartermine enth&auml;lt und das Datum mit dem Seminar verkn&uuml;pft. Oder man macht es gleich wie beim Beispiel der Bestellpositionen in einer Bestellverwaltung, wo man die Details des Artikels wie Einzelpreis oder Steuersatz aus der Artikeltabelle &uuml;bernimmt, damit diese auch nach &Auml;nderung von Preis oder Steuersatz in der Artikeltabelle in der Tabelle f&uuml;r Bestellpositionen enthalten bleiben. In diesem Fall w&uuml;rden wir dann die Felder <b>Titel<\/b>, <b>Inhalt <\/b>und <b>Preis <\/b>von der Tabelle <b>Seminarthemen <\/b>in die Tabelle <b>Seminare <\/b>&uuml;bernehmen.<\/p>\n<p>Schlie&szlig;lich ben&ouml;tigen noch die Verkn&uuml;pfungstabelle zwischen den Tabellen <b>Seminare <\/b>und <b>Kunden<\/b>, die wir, wie oben beschrieben, allein &uuml;ber Mapping mit der Fluent API definieren. Diese Tabelle soll <b>SeminareKunden <\/b>hei&szlig;en.<\/p>\n<h2>Die Entit&auml;t Kunde<\/h2>\n<p>F&uuml;r die Entit&auml;t <b>Kunde <\/b>legen wir die &uuml;blichen Eigenschaften wie Vorname, Nachname, Adresse et cetera fest. Wichtig ist hier vor allem die E-Mail-Adresse. Schlie&szlig;lich definieren wir hier eine <b>ICollection <\/b>namens <b>Seminare <\/b>f&uuml;r die Elemente des Typs <b>Seminar<\/b>. Diese wird im Konstruktor der Entit&auml;tsklasse erstellt:<\/p>\n<pre><span style=\"color:blue;\">Public Class<\/span> Kunde\r\n     <span style=\"color:blue;\">Public <\/span>Overridable Property ID<span style=\"color:blue;\"> As <\/span>Int32\r\n     <span style=\"color:blue;\">Public <\/span>Overridable Property Vorname<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Public <\/span>Overridable Property Nachname<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Public <\/span>Overridable Property Firma<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Public <\/span>Overridable Property Strasse<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Public <\/span>Overridable Property PLZ<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Public <\/span>Overridable Property Ort<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Public <\/span>Overridable Property Land<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Public <\/span>Overridable Property EMail<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Public <\/span>Overridable Property UstIDNr<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Public <\/span>Overridable Property Seminare<span style=\"color:blue;\"> As <\/span>ICollection(Of Seminar)\r\n<span style=\"color:blue;\">End Class<\/span><\/pre>\n<h2>Die Entit&auml;t Seminar<\/h2>\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\/55000271\/\">\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\/55000271?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\/55000271\/\"\/>\n\t\t\t\t<input type=\"hidden\" name=\"rcp_login_nonce\" value=\"58f932c395\"\/>\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>Es wird Zeit, die gelernten Techniken mal wieder an einer praktischen L&ouml;sung auszuprobieren. In diesem Fall soll es eine Anwendung werden, die ich selbst einsetzen will, da ich seit ein paar Wochen auch Webinare zu verschiedenen Themen anbiete. Die Herausforderung ist, die Kunden, die &uuml;ber einen Onlineshop bestellt haben, in die Anwendung einzulesen und diese den entsprechenden Seminaren beziehungsweise Webinaren zuzuordnen. Zu gegebener Zeit sollen die Teilnehmer eine Mail mit dem Link zur Teamssitzung erhalten und anschlie&szlig;end noch einen Link mit dem Download der Aufzeichnung des Seminars. Schlie&szlig;lich sollen auch noch Zertifikate &uuml;ber die Teilnahme erstellt und versendet werden. Wie dies alles gelingt, zeigt der vorliegende Artikel.<\/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":[662021,66052021,44000021,44000004],"tags":[],"yst_prominent_words":[],"class_list":["post-55000271","post","type-post","status-publish","format-standard","hentry","category-662021","category-66052021","category-Entity_Framework","category-Loesungen"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000271","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=55000271"}],"version-history":[{"count":0,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000271\/revisions"}],"wp:attachment":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/media?parent=55000271"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/categories?post=55000271"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/tags?post=55000271"},{"taxonomy":"yst_prominent_words","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/yst_prominent_words?post=55000271"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}