{"id":55000219,"date":"2020-04-01T00:00:00","date_gmt":"2020-08-25T09:06:53","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=219"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Access_zu_EDM_Dateien_erstellen","status":"publish","type":"post","link":"https:\/\/vbentwickler.de\/Access_zu_EDM_Dateien_erstellen\/","title":{"rendered":"Access zu EDM: Dateien erstellen"},"content":{"rendered":"<p><b>In vorangegangenen Artikeln haben wir Prozeduren erstellt, mit denen wir das Datenmodell einer Access-Datenbank einlesen und daraus ein Entity Data Model erstellen k&ouml;nnen. Zus&auml;tzlich haben wir auch noch die enthaltenen Daten ausgelesen und Code erzeugt, mit denen eine auf Basis des Entity Data Models erstellte SQL Server-Datenbank gef&uuml;llt werden kann. In diesem Artikel wollen wir einen Schritt weitergehen: Bisher haben wir den Code in die Zwischenablage kopiert, sodass der Benutzer diesen noch in die entsprechenden Module des Visual Studio-Projekts kopieren musste. Nun wollen wir direkt die passenden Module als Dateien erstellen, die nur noch in das Projekt gezogen werden m&uuml;ssen.<\/b><\/p>\n<p>Die Artikel, in denen wir das Erstellen des Entity Data Models auf Basis des Datenmodells einer Access-Datenbank beschrieben haben, hei&szlig;en <b>Von Access zu Entity Framework: Datenmodell <\/b>(<b>www.datenbankentwickler.net\/148<\/b>), <b>Von Access zu Entity Framework: Daten <\/b>(<b>www.datenbankentwickler.net\/1<\/b>) und <b>Von Access zu Entity Framework: Update 1 <\/b>(<b>www.datenbankentwickler.net\/164<\/b>).<\/p>\n<p>Die hier beschriebenen Prozeduren im VBA-Projekt einer Access-Datenbank lesen die Struktur des Datenmodells der Datenbank aus, die migriert werden soll, und schreibt die ermittelten Codezeilen in die Zwischenablage. Von dort aus sollen diese dann in die betroffenen Zielmodule des Visual Studio-Projekts eingef&uuml;gt werden. Das ist noch etwas unkomfortabel, sodass wir die L&ouml;sung upgraden wollen &#8211; und zwar so, dass wir im Verzeichnis der Access-Datenbank neue Dateien und Verzeichnisse erhalten, die wir direkt in den Projektmappen-Explorer von Visual Studio ziehen k&ouml;nnen.<\/p>\n<p><b>Wie soll die L&ouml;sung aussehen<\/b><\/p>\n<p>Der Ausgangspunkt ist wieder, dass Sie in dem Projekt mit dem zu erstellenden Entity Data Model ein neues Element des Typs <b>ADO.NET Entity Data Model <\/b>hinzuf&uuml;gen (siehe Bild 1). Hier geben Sie direkt die Bezeichnung der Context-Klasse an, die wir sp&auml;ter beim Zugriff &uuml;ber das Entity Data Model auf die in der Datenbank gespeicherten Daten verwenden werden &#8211; in diesem Fall <b>RechnungsverwaltungContext<\/b>.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2020_02\/pic_219_001.png\" alt=\"Neues ADO.NET Entity Data Model-Element hinzuf&uuml;gen\" width=\"649,559\" height=\"329,9938\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: Neues ADO.NET Entity Data Model-Element hinzuf&uuml;gen<\/span><\/b><\/p>\n<p>Im n&auml;chsten Schritt w&auml;hlen wir dann den Eintrag <b>Leeres Code First-Modell <\/b>aus (siehe Bild 2). Damit erscheint im Projektmappen-Explorer zun&auml;chst ein neues Element mit dem Namen, den wir dem neuen <b>ADO.NET Entity Data Model<\/b>-Element zugewiesen haben.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2020_02\/pic_219_002.png\" alt=\"Die Wahl f&auml;llt auf Leeres Code First-Modell.\" width=\"549,6265\" height=\"355,4312\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 2: Die Wahl f&auml;llt auf Leeres Code First-Modell.<\/span><\/b><\/p>\n<p>F&uuml;r die Erstellung des Entity Data Models auf Basis des Datenmodells einer Access-Datenbank merken wir uns diese Bezeichnung.<\/p>\n<p>Die Erstellung erfolgt dann durch einen einmaligen Aufruf einer Prozedur namens <b>EDMDateienErstellen<\/b>. Diese erwartet drei Parameter:<\/p>\n<ul>\n<li><b>bolEineDatei<\/b>: Gibt an, ob die Entit&auml;tsklassen direkt in die Contextklasse geschrieben werden sollen oder als einzelne Dateien in ein Unterverzeichnis.<\/li>\n<li><b>strContextname<\/b>: Erwartet den Namen des zuvor erstellten <b>ADO.NET Entity Data Model<\/b>-Elements.<\/li>\n<li><b>strUnterverzeichnisEntities<\/b>: Name des Unterverzeichnisses, in das die einzelnen Klassendateien mit den Entit&auml;ten geschrieben werden sollen.<\/li>\n<\/ul>\n<p>Ein Beispielaufruf sieht etwa wie folgt aus:<\/p>\n<pre>EDMDateienErstellen False, \"RechnungsverwaltungContext\", \"DataModel\"<\/pre>\n<p>Das Ergebnis finden Sie in Bild 3. Die Datei <b>RechnungsverwaltungContext.vb <\/b>enth&auml;lt die Anweisungen, die Sie auch in der vom Assistenten erstellten gleichnamigen Datei vorfinden &#8211; erweitert um die Definition der <b>DbSet<\/b>-Auflistungen wie zum Beispiel die folgende:<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2020_02\/pic_219_003.png\" alt=\"Ergebnis nach dem Aufruf der Prozedur EDMDateienErstellen\" width=\"549,6265\" height=\"190,0656\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 3: Ergebnis nach dem Aufruf der Prozedur EDMDateienErstellen<\/span><\/b><\/p>\n<pre><span style=\"color:blue;\">Public <\/span>Overridable Property Anreden()<span style=\"color:blue;\"> As <\/span>DbSet(Of Anrede)<\/pre>\n<p>Das Verzeichnis <b>DataModel<\/b> enth&auml;lt die Dateien aus Bild 4. Jede dieser Dateien enth&auml;lt die Definition einer Entit&auml;t des Entity Data Models. Die f&uuml;r die Tabelle <b>tblAnreden<\/b> sieht etwa wie folgt aus:<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2020_02\/pic_219_004.png\" alt=\"Inhalt des Unterverzeichnisses DataModel\" width=\"549,6265\" height=\"236,1482\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 4: Inhalt des Unterverzeichnisses DataModel<\/span><\/b><\/p>\n<pre>Imports System.ComponentModel.DataAnnotations\r\nImports System.ComponentModel.DataAnnotations.Schema\r\n&lt;Table(\"Anreden\")&gt;\r\n<span style=\"color:blue;\">Public <\/span>Partial Class Anrede\r\n     <span style=\"color:blue;\">Public <\/span>Property ID<span style=\"color:blue;\"> As <\/span>System.Int32\r\n     &lt;Index(IsUnique:=true)&gt;\r\n     &lt;StringLength(255)&gt;\r\n     &lt;Required&gt;\r\n     <span style=\"color:blue;\">Public <\/span>Property Name<span style=\"color:blue;\"> As <\/span>System.String\r\n<span style=\"color:blue;\">End Class<\/span><\/pre>\n<p>Das Ergebnis entspricht also inhaltlich dem aus den in den weiter oben referenzierten Artikeln beschriebenen Prozeduren &#8211; mit dem Unterschied, dass diese nun direkt in einem handlichen Verzeichnis liegen. Auf die gleiche Weise werden auch die &uuml;brigen Entit&auml;tsklassen in jeweils einer Datei in das Verzeichnis kopiert.<\/p>\n<p><b>Dateien zum Projekt hinzuf&uuml;gen<\/b><\/p>\n<p>Nun folgt der wichtigste Schritt: Wir wollen die Dateien, die wir soeben erstellt haben, zum Projekt hinzuf&uuml;gen. Dazu &ouml;ffnen Sie das neu erstellte Verzeichnis, dass die Unterverzeichnisse <b>DataModel <\/b>und <b>Migrations <\/b>sowie die Datei <b>RechnungsverwaltungContext.vb <\/b>enth&auml;lt und markieren die enthaltenen Elemente. Diese ziehen Sie dann in den Projektmappen-Explorer auf das Projekt-Element. Der Projektmappen-Explorer sieht danach wie in Bild 5 aus.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2020_02\/pic_219_005.png\" alt=\"Neue Elemente im Projektmappen-Explorer\" width=\"349,7625\" height=\"396,3975\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 5: Neue Elemente im Projektmappen-Explorer<\/span><\/b><\/p>\n<p>Da der Ordner <b>Migrations <\/b>bereits vorhanden ist, brauchen Sie in der Paket-Manager-Konsole nun nur noch zwei der sonst &uuml;blichen drei Anweisungen auszuf&uuml;hren, damit die Anweisungen zum Erstellen der Datenbank hinzugef&uuml;gt und die Datenbank erstellt wird. Die Anweisung <b>enable-migrations <\/b>entf&auml;llt beziehungsweise ihr Aufruf liefert nur den Hinweis, dass die Migrationen f&uuml;r dieses Projekt bereits aktiviert wurden.<\/p>\n<p>Die verbleibenden Anweisungen lauten:<\/p>\n<pre>add-migration init\r\nupdate-database<\/pre>\n<p>Erstere stellt die Methoden zusammen, mit denen die Datenbank gef&uuml;llt werden soll, letztere ruft diese auf und erstellt so die Datenbank.<\/p>\n<p>Damit erhalten wir dann die Datenbank aus Bild 6.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2020_02\/pic_219_006.png\" alt=\"Die angelegte Datenbank\" width=\"349,7625\" height=\"420,7538\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 6: Die angelegte Datenbank<\/span><\/b><\/p>\n<p><b>Programmierung der Prozeduren zum Erstellen der Klassen<\/b><\/p>\n<p>Die Hauptprozedur hei&szlig;t <b>EDMDateienErstellen <\/b>und erwartet die bereits weiter oben beschriebenen Parameter. Au&szlig;erdem verwendet sie einige Variablen, die wie folgt deklariert werden:<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>EDMDateienErstellen(bolEineDatei<span style=\"color:blue;\"> As Boolean<\/span>, strContextname<span style=\"color:blue;\"> As String<\/span>, strUnterverzeichnisEntities<span style=\"color:blue;\"> As String<\/span>)\r\n     <span style=\"color:blue;\">Dim <\/span>strDBSets<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strEntities()<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strEntityNames()<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strAllEntities<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strContextklasse<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strNamespacesEntity<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>colMappings<span style=\"color:blue;\"> As <\/span>Collection\r\n     <span style=\"color:blue;\">Dim <\/span>objMapping<span style=\"color:blue;\"> As <\/span>clsMapping\r\n     <span style=\"color:blue;\">Dim <\/span>strSeed<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strAddOrUpdate<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>i<span style=\"color:blue;\"> As Integer<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strBasispfad<span style=\"color:blue;\"> As String<\/span><\/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\/55000219\/\">\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\/55000219?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\/55000219\/\"\/>\n\t\t\t\t\t\t\t\t<input type=\"hidden\" name=\"rcp_login_nonce\" value=\"876e5995cf\"\/>\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>In vorangegangenen Artikeln haben wir Prozeduren erstellt, mit denen wir das Datenmodell einer Access-Datenbank einlesen und daraus ein Entity Data Model erstellen k&ouml;nnen. Zus&auml;tzlich haben wir auch noch die enthaltenen Daten ausgelesen und Code erzeugt, mit denen auf Basis des Entity Data Models erstellte SQL Server-Datenbank gef&uuml;llt werden kann. In diesem Artikel wollen wir einen Schritt weitergehen: Bisher haben wir den Code in die Zwischenablage kopiert, sodass der Benutzer diesen noch in die entsprechenden Module des Visual Studio-Projekts kopieren musste. Nun wollen wir direkt die passenden Module als Dateien erstellen, die nur noch in das Projekt gezogen werden m&uuml;ssen.<\/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":[66022020,662020,44000027,44000022],"tags":[],"yst_prominent_words":[],"class_list":["post-55000219","post","type-post","status-publish","format-standard","hentry","category-66022020","category-662020","category-Excel_programmieren","category-Von_Access_zu_NET"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000219","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=55000219"}],"version-history":[{"count":0,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000219\/revisions"}],"wp:attachment":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/media?parent=55000219"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/categories?post=55000219"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/tags?post=55000219"},{"taxonomy":"yst_prominent_words","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/yst_prominent_words?post=55000219"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}