<?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 tag 'NHibernate'</title><link>http://www.aspnetzone.de/search/SearchResults.aspx?o=DateDescending&amp;tag=NHibernate&amp;orTags=0</link><description>Search results matching tag 'NHibernate'</description><dc:language>en-US</dc:language><generator>CommunityServer 2.1 SP2 (Build: 61120.2)</generator><item><title>BASTA! Tag 4: NHibernate – The Open Source ORM Framework</title><link>http://www.aspnetzone.de/blogs/juergengutsch/archive/2010/02/25/basta-tag-4-nhibernate-the-open-source-orm-framework.aspx</link><pubDate>Thu, 25 Feb 2010 17:02:40 GMT</pubDate><guid isPermaLink="false">ce930855-ae9b-4fa4-8077-06a76071cc6a:216210</guid><dc:creator>Jürgen Gutsch</dc:creator><description>&lt;p&gt;Meine letzte Session des Tages startet Hadi Hariri mit viel Humor in eine umfangreiche Einführung in die Vorteile von Domain Driven Design und O/R-Mapping.&lt;/p&gt;  &lt;p&gt;Hadi erklärt tatsächlich &lt;strong&gt;drei&lt;/strong&gt; Varianten das Mapping zu definieren: Attributes, Mapping File und (na endlich) Fluent Mapping (Das Fluent NHibernate hatte ich nämlich in der letzten NHibernate Session vermisst) Weiter geht es mit der Beschreibung der Features von NHibernate: Transaction, Units of Work, Sessions, Flush Mode, etc… und anschließend mit einigen Demos zu den Mappings. Für die Abfrage der Daten empfiehlt Hadi einen der Beiden LINQ to NHibernate Provider zu nutzen und nicht die anderen drei Möglichkeiten HQL, Criterias und SQL. &lt;/p&gt;  &lt;p&gt;In der letzten Demo geht Hadi auf Fluent NHibernate ein :-) Interessant ist, dass Fluent NHibernate zwar nicht alle Mapping-Möglichkeiten abdeckt, aber, dass Fluent NHibernate mit XML-Mappings kombiniert werden kann.&lt;/p&gt;&lt;div class="wlWriterHeaderFooter" style="text-align:left;margin:0px;padding:4px 4px 4px 4px;"&gt;&lt;a href="http://dotnet-kicks.de/kick/?url=http://www.aspnetzone.de/blogs/juergengutsch/archive/2010/02/25/basta-tag-4-nhibernate-the-open-source-orm-framework.aspx"&gt;&lt;img src="http://dotnet-kicks.de/Services/Images/KickItImageGenerator.ashx?url=http://www.aspnetzone.de/blogs/juergengutsch/archive/2010/02/25/basta-tag-4-nhibernate-the-open-source-orm-framework.aspx&amp;amp;bgcolor=3169AD&amp;amp;fgcolor=FFFFFF&amp;amp;border=000000&amp;amp;cbgcolor=D4E1ED&amp;amp;cfgcolor=000000" alt="DotNetKicks-DE Image" border="0" /&gt;&lt;/a&gt;&lt;/div&gt;</description></item><item><title>BASTA! Tag 4: NHibernate und Spring.Net</title><link>http://www.aspnetzone.de/blogs/juergengutsch/archive/2010/02/25/basta-tag-4-nhibernate-und-spring-net.aspx</link><pubDate>Thu, 25 Feb 2010 13:52:16 GMT</pubDate><guid isPermaLink="false">ce930855-ae9b-4fa4-8077-06a76071cc6a:216205</guid><dc:creator>Jürgen Gutsch</dc:creator><description>&lt;p&gt;Und wieder einmal Manfred Stayer ;-) Er startet mit einer Einführung in O/R-Mapping und in NHibernate. Bei der Beschreibung von NHibernate geht Manfred sehr detailliert auf das Mapping und die Konfiguration per XML ein und zeigt per LiveCoding die Funktionsweise von NHibernate. in einem weiteren LiveDemo stellt Manfred auch LINQ to NHibernate vor.&lt;/p&gt;  &lt;p&gt;Weiter geht es mit einer LiveDemo mit Spring.NET als Dependency Injection Container und Service Locator. Etwas enttäuschend, denn nur um DI zu zeigen hätte ich eher einen kleineren schlankeren DI-Container verwendet. &lt;/p&gt;  &lt;p&gt;Anschließend geht Manfred kurz auf die weiteren Features von Spring.Net ein, z. B: Transaktionsmanagement, Unterstützung fürs Unittesting. Zum Schluss zeigt Manfred die Vor- und Nachteile von NHibernate und Spring.Net.&lt;/p&gt;&lt;div class="wlWriterHeaderFooter" style="text-align:left;margin:0px;padding:4px 4px 4px 4px;"&gt;&lt;a href="http://dotnet-kicks.de/kick/?url=http://www.aspnetzone.de/blogs/juergengutsch/archive/2010/02/25/basta-tag-4-nhibernate-und-spring-net.aspx"&gt;&lt;img src="http://dotnet-kicks.de/Services/Images/KickItImageGenerator.ashx?url=http://www.aspnetzone.de/blogs/juergengutsch/archive/2010/02/25/basta-tag-4-nhibernate-und-spring-net.aspx&amp;amp;bgcolor=3169AD&amp;amp;fgcolor=FFFFFF&amp;amp;border=000000&amp;amp;cbgcolor=D4E1ED&amp;amp;cfgcolor=000000" alt="DotNetKicks-DE Image" border="0" /&gt;&lt;/a&gt;&lt;/div&gt;</description></item><item><title>Zweiter Start mit NHibernate</title><link>http://www.aspnetzone.de/blogs/juergengutsch/archive/2009/09/28/zweiter-start-mit-nhibernate.aspx</link><pubDate>Mon, 28 Sep 2009 20:05:00 GMT</pubDate><guid isPermaLink="false">ce930855-ae9b-4fa4-8077-06a76071cc6a:213402</guid><dc:creator>Jürgen Gutsch</dc:creator><description>&lt;P&gt;Es ist eine ganze Weile her seit ich mir das letzte Mal NHibernate angeschaut habe. Damals hielt ich NHibernate für zu unflexibel und zu kompliziert, bzw. aufwändig in der Konfiguration. Zumindest damals musste das Mapping der Datenbank auf die einzelnen Objekte in XML-Dateien geschrieben werden. Anschließend wurde per externes Programm, aus den Mapping Klassen generiert, die dann für den Zugriff auf die Datenbank genutzt werden konnten. Gerade die Nutzung eines externen Tools zur Generierung der nötigen Klassen erschien mir sehr umständlich.&lt;/P&gt;
&lt;P&gt;Vor ein paar Wochen war es wieder so weit, dass ich mir NHibernate angeschaut habe. &lt;/P&gt;
&lt;P&gt;Der Grund waren ein paar positive Äußerungen in der .NET Community. Dort war immer wieder zu lesen, wie gut NHibernate im Zusammenhang mit Fluent NHibernate und LINQ to NHibernate sei. Alleine schon die Aussicht auf LINQ und de Konfiguration über Fluent Interfaces machten mich wieder neugierig auf den am häufigsten erwähnten OR-Mapper. &lt;/P&gt;
&lt;P&gt;Enttäuscht wurde ich nicht, ganz im Gegenteil. Mit dem Fluent NHibernate und LINQ to NHibernate ist es eine Freude mit NHibernate zu arbeiten. Nicht nur dass man ganz ohne XML-Konfigurationen auskommt, mit Hilfe des Fluent NHibernate lässt sich das Mapping und die Konfiguration per .NET Code schreiben. Also ob das nicht genug wäre, lässt sich mit Fluent NHibernate sogar die Datenbank dann aus dem erstellten Mapping und der Konfiguration generieren.&lt;/P&gt;
&lt;P&gt;Hier mal das Ergebnis meiner ersten Spielerei.&lt;/P&gt;
&lt;P&gt;Benötigt werden Fluent NHibernate (welches unter folgender URL heruntergeladen werden kann: &lt;A href="http://fluentnhibernate.org/"&gt;http://fluentnhibernate.org/&lt;/A&gt;, die NHibernate.dll ist dort bereits enthalten) und LINQ to NHibernate (&lt;A href="http://sourceforge.net/projects/nhibernate/files/"&gt;http://sourceforge.net/projects/nhibernate/files/&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Vorbereitung&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;Angefangen hab ich mit der Erstellung meiner Daten-Objekte &lt;/P&gt;
&lt;P&gt;Person.cs&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; Person: Entity&amp;lt;Person&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;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; Initialize() &lt;br /&gt;  { &lt;br /&gt;    Projects &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; List&amp;lt;Project&amp;gt;(); &lt;br /&gt;    Tasks &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; List&amp;lt;Task&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; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;virtual&lt;/span&gt; List&amp;lt;Project&amp;gt; Projects { get; set; } &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;virtual&lt;/span&gt; List&amp;lt;Task&amp;gt; Tasks { get; set; } &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;virtual&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; FirstName { get; set; } &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;virtual&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; LastName { get; set; } &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;virtual&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; Email { get; set; } &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;virtual&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; Telefone { get; set; } &lt;br /&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/P&gt;
&lt;P&gt;Projekt.cs&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; Project: Entity&amp;lt;Project&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;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; Initialize() &lt;br /&gt;  { &lt;br /&gt;    Persons &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; List&amp;lt;Person&amp;gt;(); &lt;br /&gt;    Tasks &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; List&amp;lt;Task&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; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;virtual&lt;/span&gt; List&amp;lt;Person&amp;gt; Persons { get; set; } &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;virtual&lt;/span&gt; List&amp;lt;Task&amp;gt; Tasks { get; set; } &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;virtual&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;  &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;virtual&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; Description { get; set; } &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;virtual&lt;/span&gt; DateTime StartDate { get; set; } &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;virtual&lt;/span&gt; DateTime EndDate { get; set; } &lt;br /&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/P&gt;
&lt;P&gt;Task.cs&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; Task: Entity&amp;lt;Task&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; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;virtual&lt;/span&gt; Person Person { get; set; } &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;virtual&lt;/span&gt; Project Project { get; set; } &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;virtual&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;  &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;virtual&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; Description { get; set; } &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;virtual&lt;/span&gt; DateTime StartDate { get; set; } &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;virtual&lt;/span&gt; DateTime EndDate { get; set; } &lt;br /&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/P&gt;
&lt;P&gt;Wie man jetzt evtl. erkennen kann ist eine kleine, einfache Aufgabenverwaltung geplant. Alle drei Objekte erben von einer generischen Basisklasse die weitere Funktionen und die Eigenschaft Id, vom Typ Guid – die in jeder Klasse enthalten ist – bereitstellt.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Mapping&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;Jetzt wird es dann eigentlich erst interessant: per Fluent NHibernate müssen die Mappings erzeugt werden. Als erste für die Person-Klasse:&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; PersonClassMap: ClassMap&amp;lt;Person&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; PersonClassMap() &lt;br /&gt;  { &lt;br /&gt;    Table(&lt;span style="color: #666666;background-color: #e4e4e4;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;"Persons"&lt;/span&gt;); &lt;br /&gt;    Id(d =&amp;gt; d.Id).GeneratedBy.Guid(); &lt;br /&gt;    Map(d =&amp;gt; d.FirstName).Not.Nullable().Length(50); &lt;br /&gt;    Map(d =&amp;gt; d.LastName).Not.Nullable().Length(50); &lt;br /&gt;    Map(d =&amp;gt; d.Email).Not.Nullable().Length(50); &lt;br /&gt;    Map(d =&amp;gt; d.Telefone).Not.Nullable().Length(50); &lt;br /&gt;    HasMany(d =&amp;gt; d.Tasks) &lt;br /&gt;      .Cascade.All() &lt;br /&gt;      .KeyColumn(&lt;span style="color: #666666;background-color: #e4e4e4;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;"PersonId"&lt;/span&gt;) &lt;br /&gt;      .Inverse(); &lt;br /&gt;    HasManyToMany(d =&amp;gt; d.Projects) &lt;br /&gt;      .Cascade.All() &lt;br /&gt;      .Table(&lt;span style="color: #666666;background-color: #e4e4e4;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;"Person2Project"&lt;/span&gt;) &lt;br /&gt;      .ParentKeyColumn(&lt;span style="color: #666666;background-color: #e4e4e4;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;"PersonId"&lt;/span&gt;) &lt;br /&gt;      .ChildKeyColumn(&lt;span style="color: #666666;background-color: #e4e4e4;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;"ProjectId"&lt;/span&gt;); &lt;br /&gt;  } &lt;br /&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/P&gt;
&lt;P&gt;Als erste wird hier der Name der Datenbank-Tabelle definiert. Anschließend mit der Methode Id() der Primärschlüssel. GeneratedBy.Guid() gibt an dass es sich um einen Autogenerierten Guid-Wert handeln soll.&lt;/P&gt;
&lt;P&gt;Die Methode Map ist die einfachste, sie mappt lediglich die Eigenschaften auf die Felder in der Datenbank. Not.Nullable()und Length(50) sind sprechend.&lt;/P&gt;
&lt;P&gt;Interessant wird es mit HasMany(), hier wird definiert, dass einer Person mehrere Aufgaben zugewiesen sein können. KeyColumn("PersonId") zeigt auf den Fremdschlüssel in der Tabelle „Tasks“. Inverse zeig an dass es das Gegenstück zur Referenzierung in der Klasse Task ist. Dort sieht die Referenz wie folgt aus:&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;References(r =&amp;gt; r.Person, &lt;span style="color: #666666;background-color: #e4e4e4;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;"PersonId"&lt;/span&gt;);&lt;/span&gt;&lt;/code&gt;&lt;/P&gt;
&lt;P&gt;Die Angabe des Spaltennamens (2. Parameter) ist notwendig wenn man diesen nicht autogeneriert haben möchte, einem bestimmten Namensschema in der Datenbank folgen möchte oder bereits einen Namen in der Datenbank vergeben hat Kniffliger als HasMany() ist HasManyToMany() hier wird eine n:m Beziehung dargestellt und definiert, dass mehrere Personen mehreren Projekten zugeordnet werden können. Wenn der Tabellenname nicht autogeneriert werden soll muss dieser angegeben werden, genauso wie die Spalten. Erscheint zunächst einfach, allerdings muss man beachten, dass das Gegenstück (im Mapping für die Projekte) rückwärts verweist: &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;HasManyToMany(d =&amp;gt; d.Persons) &lt;br /&gt;  .Cascade.All() &lt;br /&gt;  .Table(&lt;span style="color: #666666;background-color: #e4e4e4;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;"Person2Project"&lt;/span&gt;) &lt;br /&gt;  .ParentKeyColumn(&lt;span style="color: #666666;background-color: #e4e4e4;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;"ProjectId"&lt;/span&gt;) &lt;br /&gt;  .ChildKeyColumn(&lt;span style="color: #666666;background-color: #e4e4e4;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;"PersonId"&lt;/span&gt;) &lt;br /&gt;  .Inverse();&lt;/span&gt;&lt;/code&gt;&lt;/P&gt;
&lt;P&gt;Man sieht, die Spaltennamen für ParentKeyColumn sind vertauscht und es muss wieder ein Inverse() angehängt sein.&lt;/P&gt;
&lt;P&gt;Die anderen beiden Mappings sehen wie folgt aus:&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; ProjectClassMap: ClassMap&amp;lt;Project&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; ProjectClassMap() &lt;br /&gt;  { &lt;br /&gt;    Table(&lt;span style="color: #666666;background-color: #e4e4e4;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;"Projects"&lt;/span&gt;); &lt;br /&gt;    Id(d =&amp;gt; d.Id).GeneratedBy.Guid(); &lt;br /&gt;    Map(d =&amp;gt; d.Name).Not.Nullable().Length(50); &lt;br /&gt;    Map(d =&amp;gt; d.Description).Not.Nullable().Length(4000); &lt;br /&gt;    Map(d =&amp;gt; d.EndDate).Not.Nullable(); &lt;br /&gt;    Map(d =&amp;gt; d.StartDate).Not.Nullable(); &lt;br /&gt;    HasManyToMany(d =&amp;gt; d.Persons) &lt;br /&gt;      .Cascade.All() &lt;br /&gt;      .Table(&lt;span style="color: #666666;background-color: #e4e4e4;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;"Person2Project"&lt;/span&gt;) &lt;br /&gt;      .ParentKeyColumn(&lt;span style="color: #666666;background-color: #e4e4e4;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;"ProjectId"&lt;/span&gt;) &lt;br /&gt;      .ChildKeyColumn(&lt;span style="color: #666666;background-color: #e4e4e4;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;"PersonId"&lt;/span&gt;) &lt;br /&gt;      .Inverse(); &lt;br /&gt;    HasMany(d =&amp;gt; d.Tasks).Cascade.All().KeyColumn(&lt;span style="color: #666666;background-color: #e4e4e4;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;"ProjectId"&lt;/span&gt;).Inverse(); &lt;br /&gt;  } &lt;br /&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; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;class&lt;/span&gt; TaskClassMap: ClassMap&amp;lt;Task&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; TaskClassMap() &lt;br /&gt;  { &lt;br /&gt;    Table(&lt;span style="color: #666666;background-color: #e4e4e4;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;"Tasks"&lt;/span&gt;); &lt;br /&gt;    Id(d =&amp;gt; d.Id).GeneratedBy.Guid(); &lt;br /&gt;    Map(d =&amp;gt; d.Name).Not.Nullable().Length(50); &lt;br /&gt;    Map(d =&amp;gt; d.Description).Not.Nullable().Length(4000); &lt;br /&gt;    Map(d =&amp;gt; d.EndDate).Not.Nullable(); &lt;br /&gt;    Map(d =&amp;gt; d.StartDate).Not.Nullable(); &lt;br /&gt;    References(r =&amp;gt; r.Project, &lt;span style="color: #666666;background-color: #e4e4e4;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;"ProjectId"&lt;/span&gt;); &lt;br /&gt;    References(r =&amp;gt; r.Person, &lt;span style="color: #666666;background-color: #e4e4e4;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;"PersonId"&lt;/span&gt;); &lt;br /&gt;  } &lt;br /&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Konfiguration&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;Im nächsten Schritt muss die Verbindung zur Datenbank konfiguriert werden und bei Bedarf eine SessionFactory erzeugt werden. Dazu habe ich mit eine statische Klasse angelegt die wiederum zwei Methode enthält: Die erste Methode erstellt die Konfiguration und die Zweite Methode erstellt die SessionFactory anhand dieser Konfiguration.&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;static&lt;/span&gt; FluentConfiguration CreateConfiguration() &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;return&lt;/span&gt; Fluently.Configure() &lt;br /&gt;    .Database(MsSqlConfiguration.MsSql2005 &lt;br /&gt;      .ConnectionString(c =&amp;gt; c.FromAppSetting(&lt;span style="color: #666666;background-color: #e4e4e4;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;"DbConnection"&lt;/span&gt;)) &lt;br /&gt;      .ShowSql()) &lt;br /&gt;    .Mappings(m =&amp;gt; m.FluentMappings &lt;br /&gt;      .AddFromAssemblyOf&amp;lt;IEntity&amp;gt;()); &lt;br /&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/P&gt;
&lt;P&gt;Im ersten Teil der Fluently Configuration wird die Verbindung zur Datenbank definiert. Hierfür gibt es verschiedenste Möglichkeiten. (Mehr Möglichkeiten lassen sich aus der Dokumentation entnehmen: &lt;A href="http://wiki.fluentnhibernate.org/Main_Page)"&gt;http://wiki.fluentnhibernate.org/Main_Page)&lt;/A&gt; Ich habe MS SQL 2005 als Datenbankserver gewählt und lese den ConnectionString aus den App.Settings, bzw. der Web.Config aus. Außerdem möchte ich bei Fehlern den SQL-String sehen: ShowSql()&lt;/P&gt;
&lt;P&gt;Anschließend wird das Mapping zugewiesen. Das geschieht ganz einfach indem man dem Fluent NHibernate sagt, wo die Assembly mit den Mappings liegen. Es werden automatisch alle Klassen als Mapping erkannt die von ClassMap&amp;lt;T&amp;gt; erben.&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;static&lt;/span&gt; ISessionFactory CreateSessionFactory() &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;return&lt;/span&gt; CreateConfiguration().BuildSessionFactory(); &lt;br /&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/P&gt;
&lt;P&gt;Die zweite Methode ruft die erste auf und erstellt eine neue SessionFactory. Ich habe die Configuration von der Erstellung der Session getrennt um für die Generierung der Datenbank einen Konfigurationspunkt – für die Generierung der Datenbank – dazwischen zuhängen, die ich für die einfache Erzeugung der SessionFactory nicht benötige.&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;void&lt;/span&gt; SetupDatabase() &lt;br /&gt;{ &lt;br /&gt;  FluentConfiguration conf &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;=&lt;/span&gt; NHConfiguration.CreateConfiguration(); &lt;br /&gt;  conf.ExposeConfiguration(BuildSchema).BuildSessionFactory(); &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;private&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;static&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; BuildSchema(Configuration conf) &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;new&lt;/span&gt; SchemaExport(conf).Drop(&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;false&lt;/span&gt;, &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;true&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;new&lt;/span&gt; SchemaExport(conf).Create(&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;false&lt;/span&gt;, &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;true&lt;/span&gt;); &lt;br /&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/P&gt;
&lt;P&gt;Mit der Methode ExposeConfiguration() werden Anweisungen zum Exportieren des Datenbankschemas eingebunden. Das Schema wird in dem Fall in die Datenbank selber exportiert. Es wird also die Datenbank erstellt.&lt;/P&gt;
&lt;P&gt;Es empfiehlt sich die SessionFactory global, anwendungsweit bereit&amp;nbsp; zu halten, da die Erzeugung der Factory sonst recht unperformant ist. Schließlich muss das Schema erst anhand des erstellten Mappings generiert werden&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;private&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;static&lt;/span&gt; ISessionFactory sessionFactory; &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;static&lt;/span&gt; ISessionFactory SessionFactory &lt;br /&gt;{ &lt;br /&gt;  get &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;if&lt;/span&gt; (sessionFactory == &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;null&lt;/span&gt;) &lt;br /&gt;      sessionFactory &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;=&lt;/span&gt; NHConfiguration.CreateSessionFactory(); &lt;br /&gt;    &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;return&lt;/span&gt; sessionFactory; &lt;br /&gt;  } &lt;br /&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;LINQ to NHibernate&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;Eine Session kann dann innerhalb eines Using-Blocks geöffnet werden:&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;using&lt;/span&gt;(var session &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;=&lt;/span&gt; sessionFactory.OpenSession()) &lt;br /&gt;{ &lt;br /&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/P&gt;
&lt;P&gt;Innerhalb des Blocks kann dann endlich auch LINQ to NHibernate zum Einsatz kommen:&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;var q &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;=&lt;/span&gt; from a &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;in&lt;/span&gt; session.Linq&amp;lt;Person&amp;gt;() &lt;br /&gt;        where a.FirstName !&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;""&lt;/span&gt; &lt;br /&gt;        select a;&lt;/span&gt;&lt;/code&gt;&lt;/P&gt;
&lt;P&gt;Die generische Methode Linq&amp;lt;T&amp;gt;() liefert ein Ergebnis vom Typ INHibernateQueryable&amp;lt;T&amp;gt; das wiederum von IQueryable&amp;lt;T&amp;gt; und IEnumerable&amp;lt;T&amp;gt; und somit wiederum bequem per LINQ abgefragt werden kann.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Fazit&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;NHibernate ist dadurch natürlich recht schnell einsetzbar, bequemer und auch etwas flexibler, denn das Mapping und auch die Konfiguration lassen sich theoretisch so natürlich auch dynamisch erzeugen. Die Benutzung von LINQ erleichtert die Abfragen ungemein. Fluent NHibernate macht die Konfiguration und das Mapping lesbarer. &lt;/P&gt;
&lt;P&gt;Ich denke mit den beiden oben vorgestellten Erweiterungen ist NHibernate wirklich eines der genialsten OR-Mapper.&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#ff0000&gt;&lt;STRONG&gt;Update:&lt;/STRONG&gt;&lt;BR&gt;&lt;/FONT&gt;Das Beispielprojekt gibt es hier zum herunterladen: &lt;A href="http://www.aspnetzone.de/files/folders/213409/download.aspx"&gt;NHibernateTestApplication.zip&lt;/A&gt; (2.4MB)&lt;/P&gt;
&lt;DIV style="TEXT-ALIGN:left;PADDING-BOTTOM:4px;MARGIN:0px;PADDING-LEFT:4px;PADDING-RIGHT:4px;PADDING-TOP:4px;" class=wlWriterHeaderFooter&gt;&lt;A href="http://dotnet-kicks.de/kick/?url=http://www.aspnetzone.de/blogs/juergengutsch/archive/2009/09/28/zweiter-start-mit-nhibernate.aspx"&gt;&lt;IMG border=0 alt="DotNetKicks-DE Image" src="http://dotnet-kicks.de/Services/Images/KickItImageGenerator.ashx?url=http://www.aspnetzone.de/blogs/juergengutsch/archive/2009/09/28/zweiter-start-mit-nhibernate.aspx&amp;amp;bgcolor=3169AD&amp;amp;fgcolor=FFFFFF&amp;amp;border=000000&amp;amp;cbgcolor=D4E1ED&amp;amp;cfgcolor=000000"&gt;&lt;/A&gt;&lt;/DIV&gt;</description></item></channel></rss>