Entity Framework 4 CTP5 – ComplexType by Convention
In einem Beispiel zu T4 habe ich mit einem einfachen Klassendiagramm und T4 den Code erstellen lassen. Für komplexe Typen habe ich dabei die Klasse ComplexTypeConfiguration<T> verwendet.
Bei der Klasse Address handelt es sich dabei um einen komplexen Typ. Dieser soll innerhalb der Tabelle der Klasse Customer persistiert werden.
Mit folgendem Mapping lässt sich dies erreichen:
Mapping ComplexType (C#)
internal class AddressConfiguration : ComplexTypeConfiguration<Address>
{
public AddressConfiguration()
{
this.Property(x => x.Street).IsRequired().IsVariableLength().HasMaxLength(80).IsUnicode();
this.Property(x => x.City).IsRequired().IsVariableLength().HasMaxLength(100).IsUnicode();
this.Property(x => x.PostalCode).IsRequired().IsVariableLength().HasMaxLength(10).IsUnicode();
}
}
Wie diese Konfiguration dem DbContext hinzugefügt wird, ist im Beitrag DB First mit dem DbContext beschrieben.
Eine weitere interessante Möglichkeit ist das Mapping bei Konventionen. Wenn die Address-Klasse keine Id-Eigenschaft besitzt und in einer anderen Klasse wie zum Beispiel Customer verwendet wird, greift neu die Konvention und die Eigenschaften werden innerhalb der Customer-Tabelle angelegt.
Ein kleines Beispiel:
Klasse Customer (C#)
[MetadataType(typeof(CustomerMetadata))]
public class Customer
{
public int Id { get; internal set; }
public string Name { get; set; }
public Address OfficeAddress { get; internal set; }
}
Klasse Address (C#)
///[MetadataType(typeof(AddressMetadata))]
public class Address
{
public string Street { get; set; }
public string Postalcode { get; set; }
public string City { get; set; }
}
Die Kunden-Klasse enthält nun die Adresse als eigenständigen Typ. Der DbContext hat dabei folgenden Aufbau:
Notwendiger DbContext für Szenario (C#)
public class TestContext : DbContext
{
public DbSet Customers { get; set; }
}
Nach der Erstellung der Datenbank enthält die Tabelle Customers auch die Eigenschaften der Klasse Address.

- Abbildung 2 Mapping Mehere Klassen auf eine Tabelle
Bei genauer Betrachtung der Abbildung 2 fällt aber auf, dass die Datentypen wieder eine Länge von 4000 Zeichen haben. Im Code wird zudem ersichtlich, dass das MetadataAttribute für die Klasse Address auskommentiert ist.
Das liegt in einem Bug begründet. Werden die DataAnnonations auf Metadaten-Ebene verwendet, so begrüsst einen folgende Fehlermeldung:
System.Data.Entity.ModelConfiguration.ModelValidationException: One or more validation errors were detected during model generation:
- System.Data.Edm.EdmEntityType: : EntityType 'Address' has no key defined. Define the key for this EntityType.
- System.Data.Edm.EdmEntitySet: EntityType: The EntitySet Addresses is based on type Address that has no keys defined.
Die Fehlermeldung sagt mir also, dass ein Schlüssel erwartet wird. Einen Workaround dafür gibt es auch, einfach verwenden wie in der CTP 4 bzw. der Klasse Address das ComplexType-Attribut verpassen . ;-)
- 0 Kommentar(e)



Mein Kommentar