<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://www.aspnetzone.de/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Search results matching tags 'Tipps und Tricks', 'Architektur', 'Lazy&amp;lt;T&amp;gt;', and 'Tools'</title><link>http://www.aspnetzone.de/search/SearchResults.aspx?o=DateDescending&amp;tag=Tipps+und+Tricks,Architektur,Lazy%26lt%3BT%26gt%3B,Tools&amp;orTags=0</link><description>Search results matching tags 'Tipps und Tricks', 'Architektur', 'Lazy&amp;lt;T&amp;gt;', and 'Tools'</description><dc:language>en-US</dc:language><generator>CommunityServer 2.1 SP2 (Build: 61120.2)</generator><item><title>Ein Blick auf das Entity Framework 4</title><link>http://www.aspnetzone.de/blogs/juergengutsch/archive/2012/01/03/ein-blick-auf-das-entity-framework-4.aspx</link><pubDate>Tue, 03 Jan 2012 21:18:00 GMT</pubDate><guid isPermaLink="false">ce930855-ae9b-4fa4-8077-06a76071cc6a:223497</guid><dc:creator>Jürgen Gutsch</dc:creator><description>&lt;p&gt;Angeregt durch ein aktuelles Projekt, musste ich mir das Entity Framework 4 (Microsofts OR-Mapper) anschauen. Bisher hatte ich es vermieden, da ich der Meinung war, dass ich die nötigen Mappings nur über den Designer mit viel Magie und wildem herumgeklicke herstellen kann. Allerdings halte ich es für wichtig, dass die Entities, die ich in meinen Projekten benötige, nicht autogeneriert sind, bzw. nicht vom OR-Mapper generiert werden, da dadurch unnötige Abhängigkeiten zum OR-Mapper entstehen oder unnötige Objekt-Mappings gemacht werden müssen.&lt;/p&gt;  &lt;p&gt;Üblicherweise halte ich meine Entities in einem Projekt, das von allen anderen Projekten referenziert wird, die mit diesen Entities arbeiten. Mit &lt;a href="http://nuget.org/packages/NHibernate"&gt;NHibernate&lt;/a&gt; ist das auch problemlos möglich.&lt;/p&gt;  &lt;p&gt;BTW: Ich bin ein großer Fan von NHibernate und nutze diesen OR-Mapper bisher in fast jedem großen Projekt.&lt;/p&gt;  &lt;p&gt;Ich möchte also meine Entities wie folgt aufbauen:&lt;/p&gt;  &lt;p&gt;&lt;code&gt;&lt;span style="color: Black;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;public&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;class&lt;/span&gt; Customer : EntityBase   &lt;br /&gt;{    &lt;br /&gt;    [StringLength(150)]    &lt;br /&gt;    [Required]    &lt;br /&gt;    &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;public&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;string&lt;/span&gt; Name { get; set; }  &lt;br /&gt;    [StringLength(100)]   &lt;br /&gt;    [Required]    &lt;br /&gt;    &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;public&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;string&lt;/span&gt; Street { get; set; }    &lt;br /&gt;    &lt;br /&gt;    [StringLength(5)]    &lt;br /&gt;    [Required]    &lt;br /&gt;    [RegularExpression(&lt;span style="color: #666666;background-color: #e4e4e4;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;"^[0-9]{4,5}$"&lt;/span&gt;)]    &lt;br /&gt;    &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;public&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;string&lt;/span&gt; Postalcode { get; set; }    &lt;br /&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;  &lt;p&gt;EntityBase ist eine Basisklasse, welche die Id bereitstellt, Equals überschreibt, etc. Die hier sichtbaren Attribute stammen von den DataAnnotations und werden zur Validierung genutzt.&lt;/p&gt;  &lt;p&gt;Würde ich jetzt das EF wie gewohnt einsetzen, müsste ich z. B. per &lt;a href="http://nuget.org/packages/AutoMapper"&gt;AutoMapper&lt;/a&gt; von den generierten Entities auf meine Mappen. Das möchte ich nicht, bzw. müsste es mit NHibernate auch nicht tun.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;DbContext&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Nun war es heute &lt;a href="http://databinding.net"&gt;René Leupold&lt;/a&gt; der mir mit seinem Blog &lt;a href="http://databinding.net"&gt;http://databinding.net&lt;/a&gt; den entscheidenden Tipp für den DbContext gab. Mit dem DbContext ist es möglich das Entity Framework ähnlich wie NHibernate zu verwenden.&lt;/p&gt;  &lt;p&gt;Hilfreich ist auch die Artikelserie “&lt;a href="http://blogs.msdn.com/b/adonet/archive/2011/01/27/using-dbcontext-in-ef-feature-ctp5-part-1-introduction-and-model.aspx"&gt;Using DbContext in EF 4.1&lt;/a&gt;” im &lt;a href="http://blogs.msdn.com/b/adonet/"&gt;ADO.NET Team Blog&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Der DbContext ist ab EF 4.1 verfügbar. Ich selber habe mir für diese Beispiele die &lt;a href="http://nuget.org/packages/EntityFramework"&gt;EntityFramework.dll 4.2.0.0 per NuGet&lt;/a&gt; referenziert.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Das Mapping&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Was wir zusätzlich benötigen ist ein Mapping, das hier per Fluent API per C# gesetzt wird:&lt;/p&gt;  &lt;p&gt;&lt;code&gt;&lt;span style="color: Black;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;internal&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;class&lt;/span&gt; CustomerMapping : EntityTypeConfiguration&amp;lt;Customer&amp;gt;   &lt;br /&gt;{    &lt;br /&gt;    &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;public&lt;/span&gt; CustomerMapping()    &lt;br /&gt;    {    &lt;br /&gt;        Property(x =&amp;gt; x.Name)    &lt;br /&gt;            .HasMaxLength(200)    &lt;br /&gt;            .IsVariableLength()    &lt;br /&gt;            .IsUnicode()    &lt;br /&gt;            .IsOptional();    &lt;br /&gt;        Property(x =&amp;gt; x.Postalcode)    &lt;br /&gt;            .HasMaxLength(30)    &lt;br /&gt;            .IsVariableLength()    &lt;br /&gt;            .IsUnicode()    &lt;br /&gt;            .IsOptional();    &lt;br /&gt;    }    &lt;br /&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;  &lt;p&gt;Genutzt wird die Konfiguration dann im DbContext:&lt;/p&gt;  &lt;p&gt;&lt;code&gt;&lt;span style="color: Black;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;public&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;class&lt;/span&gt; DataContext : DbContext   &lt;br /&gt;{    &lt;br /&gt;    &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;public&lt;/span&gt; IDbSet&amp;lt;Customer&amp;gt; Customers { get; set; }  &lt;br /&gt;    &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;protected&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;override&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;void&lt;/span&gt; OnModelCreating(DbModelBuilder modelBuilder)   &lt;br /&gt;    {    &lt;br /&gt;        &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;base&lt;/span&gt;.OnModelCreating(modelBuilder);    &lt;br /&gt;        modelBuilder.Configurations.Add(&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;new&lt;/span&gt; CustomerConfig());    &lt;br /&gt;    }    &lt;br /&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;  &lt;p&gt;Die Ähnlichkeit mit NHibernate ist an dieser Stelle eindeutig und ich habe meine gewünschte Trennung zwischen den Entities und dem OR-Mapper.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Die Connection&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Interessant ist, dass die Verbindung zur Datenbank über den Constructor der Basisklasse DbContext gesetzt werden kann oder aber per Konvention:&lt;/p&gt; &lt;p&gt;&lt;code&gt;&lt;span style="color: Black;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: Maroon;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;connectionStrings&lt;/span&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;&amp;gt;&lt;/span&gt;   &lt;br /&gt;    &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: Maroon;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;add&lt;/span&gt; &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;name&lt;/span&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;="DataContext"&lt;/span&gt;    &lt;br /&gt;         &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;providerName&lt;/span&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;="System.Data.SqlClient"&lt;/span&gt;    &lt;br /&gt;         &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;connectionString&lt;/span&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;="Data Source=[…]"&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;/&amp;gt;&lt;/span&gt;    &lt;br /&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: Maroon;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;connectionStrings&lt;/span&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;  &lt;p&gt;Der Name des &lt;a href="http://www.connectionstrings.com/"&gt;ConnectionStrings&lt;/a&gt; muss einfach so heißen wie der entsprechende DbContext&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Benutzen&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Wenn die DB schon existiert ist das im Prinzip auch schon alles um mit den Daten zu arbeiten:&lt;/p&gt;  &lt;p&gt;&lt;code&gt;&lt;span style="color: Black;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;[Test]   &lt;br /&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;public&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;void&lt;/span&gt; SetAndLoadCustomerFromDataBase()    &lt;br /&gt;{    &lt;br /&gt;    IEnumerable&amp;lt;Customer&amp;gt; customers;  &lt;br /&gt;    &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;using&lt;/span&gt; (var context &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;=&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;new&lt;/span&gt; DataContext())   &lt;br /&gt;    {    &lt;br /&gt;        context.Customers.Add(&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;new&lt;/span&gt; Customer    &lt;br /&gt;                                  {    &lt;br /&gt;                                      Id &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;=&lt;/span&gt; Guid.NewGuid(),    &lt;br /&gt;                                      Name &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;=&lt;/span&gt; &lt;span style="color: #666666;background-color: #e4e4e4;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;"Hallo Welt"&lt;/span&gt;,    &lt;br /&gt;                                      Street &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;=&lt;/span&gt; &lt;span style="color: #666666;background-color: #e4e4e4;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;"Hallo Street 2"&lt;/span&gt;,    &lt;br /&gt;                                      Postalcode &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;=&lt;/span&gt; &lt;span style="color: #666666;background-color: #e4e4e4;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;"12345"&lt;/span&gt;    &lt;br /&gt;                                  });    &lt;br /&gt;        context.SaveChanges();    &lt;br /&gt;    }  &lt;br /&gt;    &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;using&lt;/span&gt; (var context &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;=&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;new&lt;/span&gt; DataContext())   &lt;br /&gt;    {    &lt;br /&gt;        customers &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;=&lt;/span&gt; context.Customers.Select(c =&amp;gt; c).ToList();    &lt;br /&gt;    }  &lt;br /&gt;    Assert.That(customers.Count(), Is.GreaterThan(0));   &lt;br /&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;&lt;p&gt;Das Mapping wird erzeugt, wenn das erste mal der DataContext instanziert wird. Es wird relativ viel mit Lazy&amp;lt;T&amp;gt; gearbeitet, so dass das Debugging der ergebnislisten nicht immer ganz einfach ist.&lt;/p&gt;&amp;nbsp; &lt;p&gt;&lt;strong&gt;Demo&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Eine Demo werde ich in den nächsten Tagen hier anhängen. Die vorhandenen Projekte muss ich erst noch anonymisieren.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Fazit&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Mit dem DbContext scheint das EntityFramework doch noch ein ganz passables Werkzeug und eine ernstzunehmende Alternative zum NHibernate zu sein.&lt;/p&gt;</description></item></channel></rss>