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.
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.
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:
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.
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)












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.