Von Access zum EDM per Kontextmenü

Lies in den Artikel rein und unten bekommst Du ein unschlagbares Angebot!

Nach den vorbereitenden Artikel zum Thema Erweitern von Visual Studio, Anlegen von Elementen im Projektmappen-Explorer und Hinzufügen von Elementen wie Klassen, Prozeduren et cetera per Code können wir uns an ein praktisches Beispiel begeben: Eine Anwendung, die Sie per Menüeintrag aus dem Kontextmenü eines Projekts aus aufrufen können und die nach der Auswahl der Access-Datenbank mit dem zu verwendenden Datenmodell ein Entity Data Model auf Basis dieser Datenbank erstellt. Damit können Sie dann mit wenigen Handgriffen auch direkt eine SQL Server-Datenbank generieren.

Grundlagen

Die Grundlagen zu den hier verwendeten Techniken finden Sie in den Artikeln Visual Studio erweitern: Menübefehle, Visual Studio erweitern: Elemente hinzufügen, Visual Studio mit LINQPad: Project und ProjectItems und Klassen, Methoden und Co. per Code generieren. Außerdem haben wir den größten Teil des Codes, den wir hier in eine Extension stecken wollen, in den Artikeln Von Access zu Entity Framework: Datenmodell, Von Access zu Entity Framework: Daten, Von Access zu EF: Step by Step und Von Access zu Entity Framework: Update 1 beschrieben.

Projekt erstellen

Die Erweiterung, die unsere Funktionalität in Visual Studio zur Verfügung stellen soll, basiert auf einem Projekt mit der Vorlage Visual Basic|Extensibility|VSIX Projekt, die wir Access2EDM nennen. Die beiden Elemente index.html und stylesheet.css, die im nun erstellen Projekt vorliegen, löschen wir direkt.

Dafür fügen wir über den Kontextmenü-Eintrag Hinzufügen|Neues Element… des Projekt-Elements im Projektmappen-Explorer ein neues Element des Typs Extensibility|Custom Command hinzu und nennen dieses cmdAccess2EDM.

Damit der standardmäßig im Extras-Menü angezeigte Befehl nun im Kontextmenü des Projekt-Elements im Projektmappen-Explorer erscheint, ändern wir eine Zeile in der Datei cmdAccess2EDMPackage.vsct, wo wir IDM_VS_MENU_TOOLS durch IDM_VS_CTXT_PROJNODE ersetzen, was folgende Zeile ergibt:

<Parent guid="guidSHLMainMenu" id="IDM_VS_CTXT_PROJNODE"/>

Außerdem ändern wir in der Zeile zur Definition des Elements ButtonText die Beschriftung wie folgt:

<ButtonText>EDM aus Access-Datenbank</ButtonText>

Icon hinzufügen

Als Icon wollen wir ein Access-Logo verwenden. Dieses finden wir in einer Ressourcen-Datei accicons.exe. Wir extrahieren die .ico-Datei und fügen diese zum Ordner Resources des Projekts hinzu. Außerdem ändern wir noch eine weitere Zeile in der bereits bearbeiteten Datei wie folgt ab, um die neu hinzugefügte Bilddatei zu verwenden:

<Bitmap guid="guidImages" href="Resources\Access.ico"/>

Danach finden wir den Eintrag EDM aus Access-Datenbank wie Bild 1 in im Kontextmenü des Projekt-Elements im Projektmappen-Explorer der beim Debuggen gestarteten Instanz von Visual Studio vor.

Erster Test des neuen Kontextmenü-Eintrags

Bild 1: Erster Test des neuen Kontextmenü-Eintrags

Damit sind die Arbeiten an der Datei cmdAccess2EDMPackage.vsct beendet und Sie können diese Datei speichern und schließen.

Wechsel zu LINQPad

Ab dieser Stelle sind wir für die Programmierung komplett auf LINQPad umgeschwenkt. Das ständige Warten beim Debuggen der Anwendung zum Testen zerstört jeden Programmierfluss. Nur zwischendurch zum Testen und am Ende fügen wir den produzierten Code in das VSIX-Projekt ein.

Die Basis: Entity Data Model

Basis für das Erstellen eines Entity Data Model auf Basis des Datenmodells einer Access-Datenbank ist das Hinzufügen eines neuen Elements des Typs ADO.NET Entity Date Model, was normalerweise über den Dialog Neues Element hinzufügen geschieht. Dort wird dann auch der Name des neuen Entity Data Models eingegeben (siehe Bild 2).

Hinzufügen des Entity Data Models auf herkömmlichem Wege

Bild 2: Hinzufügen des Entity Data Models auf herkömmlichem Wege

Diesen Schritt wollen wir bereits per Code erledigen und dazu müssen wir den Pfad der Vorlage ermitteln. Diese finden wir mit einer kleinen Prozedur heraus, die wir im Tool LINQPad ausführen können und die wie folgt aussieht:

Public Sub Main
     Dim objDTE As EnvDTE80.DTE2 = Nothing
     Dim objSolution As EnvDTE80.Solution2
     Dim strTemplate As String
     If GetDTE(objDTE) = True Then
         objSolution = Trycast(objDTE.Solution, EnvDTE80.Solution2)
         strTemplate = objSolution.GetProjectItemTemplate("Daten\ADO.NET Entity Data Model", "VisualBasic")
         Debug.Print(strTemplate)
     End If
End Sub

Die hier verwendete Hilfsfunktion GetDTE finden Sie in der Datei Access2EDM.linq. In dieser Datei entwickeln wir innerhalb der Benutzeroberfläche von LINQPad auch den Quellcode dieser Lösung. Der Hintergrund ist, dass das Debuggen von Extensions mit Visual Studio äußerst zeitaufwendig ist, da das Starten zum Debuggen wegen der dazu benötigten zusätzlichen Instanz von Visual Studio sehr lange dauert.

Mit der oben genannten Prozedur finden wir den Pfad der Vorlage für das ADO.NET Entity Data Model schnell heraus:

C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\Common7\IDE\ItemTemplates\VisualBasic\Data\1033\EF_EDM\ModelObjectItemVB.vstemplate

Sie können sich diese Datei auch einmal ansehen.

ADO.NET Entity Data Model-Vorlage hinzufügen

Wenn wir die oben begonnene Prozedur wie folgt erweitern, sollten eigentlich automatisch die entsprechenden Elemente für das Entity Data Model hinzugefügt werden:

If GetCurrentOrNewProject(objProject) = True Then
     objProject.ProjectItems.AddFromTemplate(strTemplate, "BestellverwaltungContext")
End If

Allerdings ruft dies noch den Dialog aus Bild 3 auf den Plan. Hier müssen wir noch die Option Leeres Code First-Modell auswählen und auf die Schaltfläche Fertigstellen klicken, damit die Elemente des leeren Entity Data Models zum Projekt hinzugefügt werden. Leider ist und keine Möglichkeit bekannt, wir diesen Dialog umschiffen können. Daher fügen wir vorher ein Meldungsfenster ein, das den Benutzer darauf hinweist, die Option Leeres Code First-Modell auszuwählen.

Entity Data Model hinzufügen

Bild 3: Entity Data Model hinzufügen

In der Datei ModelObjectItemVB.vstemplate sehen wir dann auch, dass dort noch ein Assistent namens ModelObjectItemWizard geöffnet im Spiel ist, der vermutlich den soeben beschriebenen Dialog erscheinen lässt.

 

Schreibe einen Kommentar