Entity Framework 4 – ADO.NET Entity Data Model Designer Extension Starter Kit

Für das Entity Framework 4 gibt es neu den T4 – Template Support. Damit besteht die Möglichkeit den generierten Code zu erweitern bzw. anzupassen. Was mit den T4 Vorlagen nicht funktioniert ist das Anpassen der Edmx-Datei, wenn das Modell von der Datenbank erstellt wird. Gerade wenn Datenbank-Richtlinien nicht mit dem des .NET Framework vereinbar sind ist es sinnvoll, wenn diese Richtlinien beim Anlegen des Modells transformiert bzw. eliminiert werden können.

Das Entity Developer Studio von DevArt bietet unter anderem die Möglichkeit Präfixe zu entfernen. Hierfür steht eine separate Maske zur Verfügung.

Abbildung 1
Abbildung 1 Entity Developer Studio Maske für Namensregeln

Wenn die Namensregeln definiert sind, werden die neuen Entities angepasst, die bestehenden bleiben mit den bisherigen Namensregeln erhalten.

Abbildung 2
Abbildung 2 Tabelle tabFunction auf Basis der definierten Namensregeln

Eine neue Variante ist das ADO.NET Entity Data Model Designer Extension Starter Kit (EDMDESK). Diese Visual Studio – Erweiterung kann hier heruntergeladen werden. Nach der Installation steht eine neue Vorlage in Visual Studio zur Verfügung.

Abbildung 3
Abbildung 3 Auswahl der Vorlage ADO.NET Entity Designer Extension Starter Kit

Nach der Auswahl wird eine Solution mit Beispielklassen erstellt, welche in den jeweiligen Prozessen der Generierung der Edmx-Datei eingreifen kann.

Abbildung 4
Abbildung 4 Beispielanwendung

In meinen Beispiel ist die Klasse ModelGenerationExtension von Bedeutung. Die anderen Beispielklassen entferne ich aus dem Projekt. Damit diese auch fehlerfrei kompiliert, muss der Inhalt aus der Beispielmethode AddProperty entfernt werden. Der Einstieg erfolgt über die Ereignismethoden OnAfterModelGenerated und OnAfterModelUpdated. Ich habe es noch nicht mit FxCop getestet, aber der Namensbestandteil After ist gemäss den .NET Framework Richtlinien nicht gerne gesehen ;-)

C# Ereignismethode
        public void OnAfterModelUpdated(UpdateModelExtensionContext context)
        {
            //
            // context.OriginalDocument = The original XDocument before the Update Model Wizard started.
            //                            An extension cannot modify this document.
            //
            // context.GeneratedDocument = The temporary XDocument that was generated by the Update Model wizard from the database.
            //                             An extension cannot modify this document.
            //
            // context.UpdateModelDocument = The contents of context.OriginalDocument merged with the contents of context.GeneratedDocument.
            //                               An extension cannot modify this document.
            //
            // context.CurrentDocument = The XDocument that will be saved.
            //                           An extension can modify this document. Note that the document may have been modified by another extension's implementation of OnAfterModelUpdated().
            //
            //
            // context.ProjectItem = The EnvDTE.ProjectItem of current .edmx file.
            //
            // context.Project = The EnvDTE.Project that contains the .edmx file.
            //
            // context.WizardKind = The wizard that initiated the .edmx file generation or update process (WizardKind.UpdateModel).
            //

            bool efV2Model = IsEntityFrameworkV2Model(context.Project);
            String caption = "OnAfterModelGenerated called";
            String message = String.Format("An EF v{0} model was updated from the database by the 'Update Model From Database' wizard.\n\n", efV2Model ? 2 : 1);

            if (efV2Model)
            {
                // Call helper method to add a new property to the generated EF v2 model.
                AddPropertyToModel(context.CurrentDocument);

                message += "Added a new property to EntityTypes in the updated model.";
            }

            MessageBox.Show(message, caption);
        }

Die Möglichkeiten sind sehr schön in den Methoden dokumentiert, sodass eigentlich gleich programmiert werden kann. Die Edmx-Datei wird als XDocument übergeben. Damit besteht die Möglichkeit, das Modell mit Hilfe von Linq to XML abzufragen.

Szenario

Eine der häufig anzutreffenden Richtlinien auf Datenbankebene ist der Einsatz von Präfixen auf Tabellen-, Sicht- und Spaltennamen. Auf dieser Ebene gibt es wiederum mehrere Varianten. Eine Variante, die sich wunderbar mit diesem Extension Kit eliminieren lässt, ist die ungarische Notationsform. Bei dieser Notation werden die Datentypen als Präfix der Spalte vorangestellt. Im Klassendesign (siehe Abbildung 2) ist so eine Notationsform in meinen Augen nicht zu gebrauchen und das manuelle Anpassen des Modells ist zeitaufwendig und nicht erstrebenswert.

Für diesen Zweck habe ich bereits Klassen erstellt, auf die ich nicht näher eingehe. Die Aufgabe dieser Klassen sind das Abfragen und Bearbeiten des Dokuments. In der Klasse ModelGenerationExtension füge ich dafür eine neue Methode ein, die später von den Ereignismethoden aufgerufen wird.

 C# (Aufruf Methode)
private void ConvertNameAttributes(XDocument model)
{
  var converter = new EfNameConverter();
  converter.PrefixPropertyDescriptions = "lng;str;dbl;dtm";
  converter.PrefixEntityDescriptions = "tab;vw;";
  converter.ReplaceContentList.Add(new Tuple("bit", "Is"));
  converter.ReplaceContentList.Add(new Tuple("AutoID", "Id"));
  converter.ConvertEdmxDocument(model);
}

In dieser Methode wird eine Instanz einer benutzerdefinierten Klasse erzeugt und die Präfixe der Tabellen, Sichten und Spaltennamen definiert. Sonderfälle können mit der ReplaceContentList behandelt werden. So ist es beispielsweise möglich, dass der Präfix bit für bool durch ein „Is“ ersetzt werden kann, damit bitActive in IsActive umgewandelt wird. Auch Namensbestandteile wie AutoID können so in besser klingende Namen umgewandelt werden.

Der Aufruf erfolgt in den Ereignismethoden wie folgt:

C# Aufruf für Ereignismethoden
this.ConvertNameAttributes(context.CurrentDocument);

Hier wird vom Kontext das aktuelle Dokument übergeben, da dies von der Erweiterung bearbeitet werden kann. Nach der Kompilierung des Projekts wird im Ausgabeordner eine *.vsix – Datei erstellt. Hierbei handelt es um eine Visual Studio Erweiterung. Beim Ausführen erscheint folgende Maske:

Abbildung 5
Abbildung 5 EDM Installer
Abbildung 6
Abbildung 6 Visual Studio Erweiterung nach erfolgreicher Installation

Wenn Visual Studio geöffnet ist, muss es geschlossen und neu gestartet werden. Nach dieser Aktion wird unter dem Menüpunkt Extras/Erweiterungs-Manager die Erweiterung angezeigt.

Abbildung 7
Abbildung 7 Erweiterungs-Manager

Wenn die Erweiterung aktiv ist, werden bei allen Entity Modellen anhand der definierten Regeln die Namen umbenannt.

Dazu werden im Assistent die Tabellen ausgewählt.

Abbildung 8
Abbildung 8 Auswahl der Entitäten

Diese Entitäten haben den Präfix „tab“. Wenn die Visual Studio Erweiterung richtig funktioniert, gibt es 2 Klassen mit den Namen Function und Staff. Nach dem drücken der Schaltfläche „Fertig stellen“ erscheint eine Information, die auf den Vorgang der Erweiterung hinweist.

Abbildung 9
Abbildung 9 Nachricht der Visual Studio Erweiterung

Die generierte Datei hat nun 2 Entitäten und die Richtlinien der Datenbanknamen wurden für das Modell eliminiert.

Abbildung 10
Abbildung 10 Erstellte Entitäten mit der Visual Studio Erweiterung

Wenn ich das Entity Developer Studio mit dem ADO.NET Entity Data Model Extension Starter Kit vergleiche, ist es in dieser Situation mächtiger, weil es mir viel mehr Möglichkeiten eröffnet.

In Projekten bei denen die Richtlinien der Datenbank im Bereich der Namen mit denen der .NET Framework Richtlinien sehr stark in Konflikt stehen, ist diese Erweiterungsmöglichkeit eine optimale Lösung um das Problem elegant zu beheben.

  •  
  • 1 Kommentar(e)
  •  
Gravatar: Tim FischerTim Fischer
08.05.2010
09:11
Intelli-Sense und Hightlighting für T4 Templates

Mit dem T4 Editor von tangible kann man die tempaltes sehr komfortabel editieren:

http://t4-editor.tangible-engineering.com

Er ist auch in der Visual Studio Gallery und dem Extension Manager von VS2010 zu finden.

Mein Kommentar

Über jeden weiteren Kommentar in diesem Post benachrichtigen.

Zurück

Translate this page

Kategorien

  • [-].NET Development (215)
  • [-]Datenbank (26)
  • HTML (1)
  • Konfiguration (12)
  • Mind Map (10)
  • Off-topic (9)
  • Open Source (3)
  • Qualität (7)
  • Sharepoint (6)
  • Sicherheit (2)

Archiv

Social Bookmarking

Bookmark bei: Mr. Wong Bookmark bei: Webnews Bookmark bei: Icio Bookmark bei: Oneview Bookmark bei: Linkarena Bookmark bei: Favoriten Bookmark bei: Seekxl Bookmark bei: Favit Bookmark bei: Social Bookmarking Tool Bookmark bei: Power Oldie Bookmark bei: Bookmarks.cc Bookmark bei: Newskick Bookmark bei: Newsider Bookmark bei: Linksilo Bookmark bei: Readster Bookmark bei: Folkd Bookmark bei: Yigg Bookmark bei: Digg Bookmark bei: Del.icio.us Bookmark bei: Reddit Bookmark bei: Simpy Bookmark bei: StumbleUpon Bookmark bei: Slashdot Bookmark bei: Netscape Bookmark bei: Furl Bookmark bei: Yahoo Bookmark bei: Spurl Bookmark bei: Google Bookmark bei: Blinklist Bookmark bei: Blogmarks Bookmark bei: Diigo Bookmark bei: Technorati Bookmark bei: Newsvine Bookmark bei: Blinkbits Bookmark bei: Ma.Gnolia Bookmark bei: Smarking Bookmark bei: Netvouz Information