Entity Framework 4 - DB First mit dem DbContext ab CTP 5
Die CTP 5 ist jetzt schon ein paar Tage verfügbar und auch ich habe ein wenig damit experimentiert. Neu wird eine T4-Vorlage mitgeliefert, mit der das Mapping für bestehende Datenbanken bzw. mit dem EDM-Designer für den DBContext generiert werden kann.
Mit der CTP 4 habe ich bereits erste Erfahrungen sammeln können und einfache Beispiele in Präsentationen verwendet. In meinen Vorlagen werden von einem einfachen Klassendiagramm die Klassen, Mappings, Metaklassen der Validierung, Repositories und Ressourcen erstellt. Primär geht es aber mit den kommenden Erweiterungen um die codezentrierte Anwendungsentwicklung.
Als Beispiel folgendes Klassenmodell, das sehr einfach gehalten ist und nicht den Anspruch besitzt UML 2-konform zu sein. ;-)
Die Adresse wird durch die Vorlage als Complex Type umgesetzt. Dieses Beispiel befindet sich im übrigen in der T4DemoSolution im T4 MindMap. Deshalb gehe ich jetzt nicht weiter auf die Details ein.
Hier möchte ich den Blick auf die Konfiguration legen. Dabei werden für die Klasse Customer und Address folgende Mappings angelegt.
Mapping-Konfiguration ComplexType CTP 4 (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();
}
}
Mapping-Konfiguration Entity CTP 4 (C#)
internal class CustomerConfiguration : EntityConfiguration<Customer>
{
public CustomerConfiguration()
{
this.HasKey(x => x.Id);
this.Property(x => x.Id).IsIdentity();;
this.Property(x => x.Firstname).IsVariableLength().HasMaxLength(80).IsUnicode();
this.Property(x => x.Lastname).IsVariableLength().HasMaxLength(80).IsUnicode();
this.Property(x => x.Phone).IsRequired().IsVariableLength().HasMaxLength(25).IsUnicode();
this.Property(x => x.Email).IsRequired().IsVariableLength().HasMaxLength(150).IsUnicode();
this.MapSingleType().ToTable("Customer");
}
}
Im DbContext werden diese Mappings durch das Überschreiben der Methode OnModelCreating hinzugefügt. Mit diesen Informationen ist die CTP 4 in der Lage eine brauchbare Datenbank zu erstellen. Natürlich können die Angaben der Konfigrationsklassen auch direkt in der Methode definiert werden.
Konfiguration DbContext CTP 4 (C#)
public class OrderCatalog : DbContext, IOrderCatalog
{
public IDbSet Orders { get; set; }
public IDbSet OrderItems { get; set; }
public IDbSet Customers { get; set; }
public IDbSet Products { get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Configurations.Add(new OrderConfiguration());
modelBuilder.Configurations.Add(new OrderItemConfiguration());
modelBuilder.Configurations.Add(new CustomerConfiguration());
modelBuilder.Configurations.Add(new ProductConfiguration());
modelBuilder.Configurations.Add(new AddressConfiguration());
}
...
}
Der erzeugte DbContext hat folgenden Inhalt.
Erzeugter Code mithilfe der T4-Vorlage aus der CTP5 (C#)
public partial class ContentEntities : DbContext
{
public ContentEntities()
: base("name=ContentEntities")
{
}
public DbSet BusinessUnits { get; set; }
public DbSet Mandators { get; set; }
}
Das Erste was hier auffällt, die Methode OnModelCreating wird nicht überschrieben und es gibt keine Konfiguration, obwohl es Unterschiede bedingt durch die Präfixe gibt. Testet man das Modell mit ein paar Abfragen, so funktioniert dies auch ohne Probleme und auch die Eigenschaften haben korrekte Werte.
Schaut man sich die Verbindungszeichenfolge an, wird klar, warum der DbContext in der CTP 5 so funktioniert.
Die CTP 5 ist nun in der Lage, die bis anhin typischen Angaben (ssdl, msl, csdl) in der Verbindungszeichenfolge zu nutzen. Dadurch ist nun auch der DB First-Ansatz mit dem DbContext im EDM-Designer möglich.
- 0 Kommentar(e)




Mein Kommentar