Entity Framework 4 - Erweiterte Eigenschaften in einer T4-Vorlage verwenden
Im vorherigen Beitrag wurde der EF Designer um ein paar Eigenschaften erweitert, die für die Code-Generierung verwendet werden sollen. Die Werte werden dabei ebenfalls in der EDMX-Datei im konzeptionellen Bereich innerhalb des definierten Namensraums abgelegt. In meinem Beispiel heisst dieser "http: //schemas.databinding.net/Repository". Für den Zugriff auf die Eigenschaften ist das von Bedeutung.
Da diese Eigenschaften auf Ebene der Entität definiert worden sind, werden diese unterhalb abgelegt.
Dieser Ansatz hat Vor- und Nachteile. Ein Vorteil: Diese Eigenschaften stehen auch zur Verfügung, wenn die Extension nicht mehr installiert ist. Ein Nachteil: Es kann das XML aufblähen und nicht mehr verwendete Eigenschaften werden nicht aus der Datei entfernt, das wiederum kann die Verständlichkeit erschweren.
Kommen wir nun zur Verwendung in einer T4-Vorlage. Das Entity Framwork stellt u.a. die Basisklassen CodeGenerationTools, MetadataLoader und MetadataTools zur Verfügung.
Für die Code-Generierung von Klassen ist häufig der konzeptionelle Bereich von Bedeutung, damit dies zur Anwendung kommt, ist folgende Initialisierung notwendig.
Initialisierung der Basisfunktionalität für das Abfragen der EDMX-Datei (C#) string repositoryNamespace = @"http://schemas.databinding.net/Repository"; CodeGenerationTools code = new CodeGenerationTools(this); MetadataLoader loader = new MetadataLoader(this); CodeRegion region = new CodeRegion(this, 1); MetadataTools ef = new MetadataTools(this); string inputFile = @"Model.edmx"; MetadataWorkspace metadataWorkspace = null; bool allMetadataLoaded =loader.TryLoadAllMetadata(inputFile, out metadataWorkspace); EdmItemCollection ItemCollection = (EdmItemCollection)metadataWorkspace.GetItemCollection(DataSpace.CSpace);
Die Klasse MetadataLoader ist dabei von Bedeutung, da mit dieser der Arbeitsraum geladen und initialisiert wird. Die Auflistung der Objekte aus dem konzeptionellen Bereich werden mithilfe des Enum-Wertes DataSpace.CSpace geladen. Dabei stehen die Metadaten der Entities in der Klasse EntityType zur Verfügung.
Benutzerdefinierte Metadaten sind in der Auflistung MetadataProperties enthalten. Der Name einer Eigenschaft setzt sich dabei aus dem Namensraum und des Eigenschaftsnamens zusammen. Die Value-Eigenschaft repräsentiert ein Objekt, das in dieser Form als XElement gecasted werden kann und muss, um an den Wert zu gelangen.
Abfrage der Metadaten (C#)
foreach (EntityType entity in ItemCollection.GetItems<EntityType>().OrderBy(e => e.Name))
{
var p = entity.MetadataProperties.Where(m=>m.Name == repositoryNamespace + ":IsRepositoryEntryPoint").FirstOrDefault();
if (p != null)
{
var element = p.Value as XElement;
…
}
}
Es ist kein grosser Aufwand, an die Informationen zu gelangen. Bei bestehenden Vorlagen müssen nur die Metadaten-Eigenschaften auf der entsprechenden Ebene abgefragt werden. In meinem Beispiel verzichte ich auf die Darstellung der erstellten Klassen und das Anlegen der Metadaten-Klasse.
Wer sich dafür interessiert, kann die Beispiele aus dem T4-Mindmap herunterladen.
- 0 Kommentar(e)




Mein Kommentar