<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-2504865884110659551</id><updated>2011-11-08T12:06:03.882-05:00</updated><category term='NHibernate'/><category term='iphone'/><category term='html-css-jquery'/><category term='monotouch'/><category term='unity'/><title type='text'>code that works</title><subtitle type='html'>ideas on .net programming</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://codethatworks.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2504865884110659551/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://codethatworks.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Sylvain Hamel</name><uri>http://www.blogger.com/profile/02893038274559437241</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>9</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-2504865884110659551.post-2313841722346558941</id><published>2010-02-20T22:08:00.001-05:00</published><updated>2010-02-20T22:11:36.482-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='NHibernate'/><title type='text'>No configuration file with NHibernate</title><content type='html'>&lt;p&gt;&lt;em&gt;&lt;font color="#0000ff"&gt;Note: This post is based on NHibernate version 2.1 with Fluent NHibernate version 1.0 RTM.&lt;/font&gt;&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;In my previous post about Fluent NHibernate, I explained how to use Fluent NHibernate to replace your &lt;strong&gt;NHibernate mapping files&lt;/strong&gt; (.hbm.config) with c# code. In this post I'll show you how to also replace the&amp;#160; &lt;strong&gt;NHibernate configuation file&lt;/strong&gt; (.cfg.xml) with code.&lt;/p&gt;  &lt;p&gt;This time you don't need to add references to any special library. Converting the config file to code is very, very easy. The config file is made up of a bunch of dictionary entries where each entry has a key (the NHibernate setting name) and a value (the actual value for that setting). The NHibernate has a configuration API that works the same way. So you can just take out the line that loads your config file (config.Configure(&amp;quot;PocoLib.cfg.xml&amp;quot;);) with a series of calls config.Properties.Add().&lt;/p&gt;  &lt;table cellspacing="0" cellpadding="2" width="759" border="0"&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td valign="top" width="354"&gt;&lt;strong&gt;Before (with a .cfg.xml file)&lt;/strong&gt;&lt;/td&gt;        &lt;td valign="top" width="403"&gt;&lt;strong&gt;After (with code)&lt;/strong&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="354"&gt;         &lt;p&gt;&amp;lt;hibernate-configuration xmlns=&amp;quot;urn:nhibernate-configuration-2.2&amp;quot;&amp;gt;           &lt;br /&gt;&amp;#160; &amp;lt;session-factory&amp;gt;            &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;property name=&amp;quot;connection.provider&amp;quot;&amp;gt;            &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; NHibernate.Connection.DriverConnectionProvider            &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/property&amp;gt;            &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;property name=&amp;quot;connection.driver_class&amp;quot;&amp;gt;            &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; NHibernate.Driver.SqlClientDriver            &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/property&amp;gt;            &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;property name=&amp;quot;connection.connection_string&amp;quot;&amp;gt;            &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Server=xp-octosql;database=PocoLib;Integrated Security=SSPI;            &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/property&amp;gt;            &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;property name=&amp;quot;dialect&amp;quot;&amp;gt;            &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; NHibernate.Dialect.MsSql2005Dialect            &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/property&amp;gt;            &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;property name=&amp;quot;show_sql&amp;quot;&amp;gt;            &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; true            &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/property&amp;gt;            &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;property name='proxyfactory.factory_class'&amp;gt;            &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; NHibernate.ByteCode.LinFu.ProxyFactoryFactory, NHibernate.ByteCode.LinFu            &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/property&amp;gt;            &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;property name=&amp;quot;adonet.batch_size&amp;quot;&amp;gt;16&amp;lt;/property&amp;gt;            &lt;br /&gt;&amp;#160; &amp;lt;/session-factory&amp;gt;            &lt;br /&gt;&amp;lt;/hibernate-configuration&amp;gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td valign="top" width="403"&gt;         &lt;p&gt;Configuration config = new Configuration();&lt;/p&gt;          &lt;p&gt;config.Properties.Add(&amp;quot;connection.provider&amp;quot;, &amp;quot;NHibernate.Connection.DriverConnectionProvider, NHibernate&amp;quot;);           &lt;br /&gt;            &lt;br /&gt;config.Properties.Add(&amp;quot;connection.driver_class&amp;quot;, &amp;quot;NHibernate.Driver.SqlClientDriver&amp;quot;);            &lt;br /&gt;            &lt;br /&gt;config.Properties.Add(&amp;quot;dialect&amp;quot;, &amp;quot;NHibernate.Dialect.MsSql2005Dialect&amp;quot;);            &lt;br /&gt;            &lt;br /&gt;config.Properties.Add(&amp;quot;connection.connection_string&amp;quot;, &amp;quot;Server=xp-octosql;database=PocoLib;Integrated Security=SSPI;&amp;quot;);&lt;/p&gt;          &lt;p&gt;config.Properties.Add(&amp;quot;show_sql&amp;quot;, &amp;quot;true&amp;quot;);           &lt;br /&gt;            &lt;br /&gt;config.Properties.Add(&amp;quot;proxyfactory.factory_class&amp;quot;, &amp;quot;NHibernate.ByteCode.LinFu.ProxyFactoryFactory, NHibernate.ByteCode.LinFu&amp;quot;);            &lt;br /&gt;            &lt;br /&gt;config.Properties.Add(&amp;quot;adonet.batch_size&amp;quot;, &amp;quot;16&amp;quot;);&lt;/p&gt;          &lt;p&gt;&amp;#160; Fluently.Configure(configuration)            &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; .Mappings(m =&amp;gt; m.FluentMappings.AddFromAssemblyOf&amp;lt;CustomerCRUDTests&amp;gt;())             &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; .BuildConfiguration(); &lt;/p&gt;          &lt;p&gt; _factory = config.BuildSessionFactory(); &lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2504865884110659551-2313841722346558941?l=codethatworks.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codethatworks.blogspot.com/feeds/2313841722346558941/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codethatworks.blogspot.com/2010/02/no-configuration-file-with-nhibernate.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2504865884110659551/posts/default/2313841722346558941'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2504865884110659551/posts/default/2313841722346558941'/><link rel='alternate' type='text/html' href='http://codethatworks.blogspot.com/2010/02/no-configuration-file-with-nhibernate.html' title='No configuration file with NHibernate'/><author><name>Sylvain Hamel</name><uri>http://www.blogger.com/profile/02893038274559437241</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2504865884110659551.post-48426925383600970</id><published>2009-12-26T22:04:00.001-05:00</published><updated>2009-12-26T22:05:47.307-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='NHibernate'/><title type='text'>Fluent NHibernate Tutorial</title><content type='html'>&lt;p&gt;&lt;em&gt;&lt;font face="Times New Roman" color="#3a62a3"&gt;Note: This post is based on NHibernate version 2.1 with Fluent NHibernate version 1.0 RTM.&lt;/font&gt;&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;This tutorial introduces Fluent NHibernate. Fluent NHibernate is a &amp;quot;code oriented&amp;quot; alternative to configuring NHibernate maping using XML configuration files.&lt;/p&gt;  &lt;p&gt;This tutorial is based on same project entities defined in my previous &lt;a href="http://codethatworks.blogspot.com/2009/11/getting-started-with-nhibernate.html"&gt;NHibernate tutorial&lt;/a&gt;. At end of this tutorial, you will have the exact same result but with entities configured using Fluent NHibernate instead of an XML configuration file.&lt;/p&gt;  &lt;p&gt;1. Open you the Solution PocoLib.&lt;/p&gt;  &lt;p&gt;2. Add a reference to FluentNHibernate in the PocoLibTests&lt;/p&gt;  &lt;p&gt;3. Add a new class named CustomerMap.cs to the PocoLibTests project. The source code for CustomerMap.cs is in the left column in the table below. The code speaks for itself; it's almost identical in structure to the XML configuration file.&lt;/p&gt;  &lt;table cellspacing="0" cellpadding="2" width="687" border="1"&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td valign="top" width="427"&gt;&lt;strong&gt;CustomerMap.cs&lt;/strong&gt;&lt;/td&gt;        &lt;td valign="top" width="258"&gt;&lt;strong&gt;Customer.hbm.xml&lt;/strong&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="427"&gt;         &lt;p&gt;&lt;font face="Courier New"&gt;using FluentNHibernate.Mapping;             &lt;br /&gt;using PocoLib; &lt;/font&gt;&lt;/p&gt;          &lt;p&gt;&lt;font face="Courier New"&gt;namespace PocoLibTests             &lt;br /&gt;{              &lt;br /&gt;&amp;#160; public class CustomerMap : ClassMap&amp;lt;Customer&amp;gt;              &lt;br /&gt;&amp;#160; {              &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; public CustomerMap()              &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {              &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Not.LazyLoad();              &lt;br /&gt;              &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Id(cust =&amp;gt; cust.ID, &amp;quot;CustomerID&amp;quot;);              &lt;br /&gt;              &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Map(cust =&amp;gt; cust.FirstName);              &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Map(cust =&amp;gt; cust.LastName);              &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Map(cust =&amp;gt; cust.BirthDate); &lt;/font&gt;&lt;/p&gt;          &lt;p&gt;&lt;font face="Courier New"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Component&amp;lt;Address&amp;gt;(cust =&amp;gt; cust.Address,             &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; component =&amp;gt;              &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {              &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; component.Map(address =&amp;gt; address.Street);              &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; component.Map(address =&amp;gt; address.State);              &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; component.Map(address =&amp;gt; address.Country);              &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; component.Map(address =&amp;gt; address.ZipCode);              &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; });              &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }              &lt;br /&gt;&amp;#160; }              &lt;br /&gt;}&lt;/font&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td valign="top" width="258"&gt;         &lt;p&gt;           &lt;br /&gt;            &lt;br /&gt;            &lt;br /&gt;            &lt;br /&gt;            &lt;br /&gt;            &lt;br /&gt;            &lt;br /&gt;&amp;lt;class name=&amp;quot;Customer&amp;quot;             &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; lazy=&amp;quot;false&amp;quot;&amp;gt;            &lt;br /&gt;            &lt;br /&gt;&amp;#160; &amp;lt;id name=&amp;quot;ID&amp;quot; column=&amp;quot;CustomerID&amp;quot;&amp;gt;            &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;generator class=&amp;quot;native&amp;quot;/&amp;gt;            &lt;br /&gt;&amp;#160; &amp;lt;/id&amp;gt;            &lt;br /&gt;            &lt;br /&gt;&amp;#160; &amp;lt;property name=&amp;quot;FirstName&amp;quot;/&amp;gt;            &lt;br /&gt;&amp;#160; &amp;lt;property name=&amp;quot;LastName&amp;quot;/&amp;gt;            &lt;br /&gt;&amp;#160; &amp;lt;property name=&amp;quot;BirthDate&amp;quot;/&amp;gt;            &lt;br /&gt;            &lt;br /&gt;&amp;#160; &amp;lt;component name=&amp;quot;Address&amp;quot;&amp;gt;            &lt;br /&gt;            &lt;br /&gt;            &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;property name=&amp;quot;Street&amp;quot;/&amp;gt;            &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;property name=&amp;quot;State&amp;quot;/&amp;gt;            &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;property name=&amp;quot;Country&amp;quot;/&amp;gt;            &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;property name=&amp;quot;ZipCode&amp;quot;/&amp;gt;            &lt;br /&gt;&amp;#160; &amp;lt;/component&amp;gt;            &lt;br /&gt;            &lt;br /&gt;&amp;lt;/class&amp;gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;p&gt;4. Now, open the test class. We must change the Setup method and replace the line that loads the the configuration from Customer.hbm.xml to load it using Fluent Nhibernate. &lt;/p&gt;  &lt;p&gt;&lt;font color="#515151"&gt;[SetUp]     &lt;br /&gt;public void Setup()      &lt;br /&gt;{      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Configuration configuration = new Configuration();      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; configuration.Configure(&amp;quot;PocoLib.cfg.xml&amp;quot;);&lt;/font&gt; &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; &lt;strike&gt;configuration.AddXmlFile(&amp;quot;Customer.hbm.xml&amp;quot;); &lt;/strike&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#000000"&gt;&amp;#160;&amp;#160;&amp;#160; Fluently.Configure(configuration)     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; .Mappings(m =&amp;gt; m.FluentMappings.AddFromAssemblyOf&amp;lt;CustomerCRUDTests&amp;gt;())      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; .BuildConfiguration(); &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; _factory = configuration.BuildSessionFactory();   &lt;br /&gt;}&lt;/p&gt;  &lt;p&gt;5. Delete the Customer.hbm.xml file from the PocoLib project and from the /debug/bin/ folder of the PocoLibTests project.&lt;/p&gt;  &lt;p&gt;6. You can now run the tests tests.&lt;/p&gt;  &lt;p&gt;That's it for this quick Fluent NHibernate tutorial.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2504865884110659551-48426925383600970?l=codethatworks.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codethatworks.blogspot.com/feeds/48426925383600970/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codethatworks.blogspot.com/2009/12/fluent-nhibernate.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2504865884110659551/posts/default/48426925383600970'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2504865884110659551/posts/default/48426925383600970'/><link rel='alternate' type='text/html' href='http://codethatworks.blogspot.com/2009/12/fluent-nhibernate.html' title='Fluent NHibernate Tutorial'/><author><name>Sylvain Hamel</name><uri>http://www.blogger.com/profile/02893038274559437241</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2504865884110659551.post-6546175869508638519</id><published>2009-11-08T21:19:00.001-05:00</published><updated>2009-11-08T21:20:06.711-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='NHibernate'/><title type='text'>LINQ to NHibernate Tutorial</title><content type='html'>&lt;p&gt;&lt;em&gt;&lt;font face="Times New Roman" color="#3a62a3"&gt;Note: This post applies to NHibernate 2.1 with LINQ to NHibernate version 1.0.&lt;/font&gt;&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;Starting with LINQ to NHibernate is really simple; you just have to add a reference to NHibernate.Linq.dll to your host project (a test project, an ASP.NET app).&lt;/p&gt;  &lt;p&gt;Here is a unit test to demonstrate a simple LINQ query.&amp;#160; This test uses the same entities defined in my previous &lt;a href="http://codethatworks.blogspot.com/2009/11/getting-started-with-nhibernate.html"&gt;NHibernate tutorial&lt;/a&gt;.&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;font face="Courier New"&gt;[Test]       &lt;br /&gt;public void SelectWithPredicate()        &lt;br /&gt;{        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; using (var session = _factory.OpenSession())        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; //Act        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; var customers = from cust in &lt;strong&gt;&lt;font color="#000080"&gt;session.Linq&amp;lt;Customer&amp;gt;()&lt;/font&gt;&lt;/strong&gt;        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; where cust.LastName.StartsWith(&amp;quot;St&amp;quot;)        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; select cust;        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; //Assert        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Assert.AreEqual(1, customers.Count());        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }        &lt;br /&gt;}&lt;/font&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;The Linq() method is an extension method defined in NHibernate.Linq.dll. It provides the entry point to execute Linq queries on your NHibernate entities. When you run that test, NHibernate generates the following statement:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;font face="Courier New"&gt;SELECT count(*) as y0_ FROM Customer this_        &lt;br /&gt;WHERE this_.LastName like @p0;@p0 = 'St%'&lt;/font&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt; In an upcoming post I will explore the capabilities and limitations of LINQ to NHibernate. For now, here is the full test class I used to discover LINQ to NHibernate:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;font face="Courier New"&gt;using System.Diagnostics;       &lt;br /&gt;using System.Linq;        &lt;br /&gt;using NHibernate;        &lt;br /&gt;using NHibernate.Cfg;        &lt;br /&gt;using NHibernate.Linq;        &lt;br /&gt;using NUnit.Framework;        &lt;br /&gt;using PocoLib; &lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New"&gt;namespace PocoLibTests       &lt;br /&gt;{        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; [TestFixture]        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; public class CustomerLINQTests        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; private ISessionFactory _factory; &lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; [SetUp]       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public void Setup()        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Configuration configuration = new Configuration();        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; configuration.Configure(&amp;quot;PocoLib.cfg.xml&amp;quot;);        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; configuration.AddXmlFile(&amp;quot;Customer.hbm.xml&amp;quot;); &lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; _factory = configuration.BuildSessionFactory(); &lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; SetupDatabase();       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } &lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; [TearDown]       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public void TearDown()        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; PurgeDatabase();        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } &lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; [Test]       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public void SelectAllCustomers()        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; using (var session = _factory.OpenSession())        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; //Act        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; var customers = from cust in session.Linq&amp;lt;Customer&amp;gt;()        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; select cust;        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; //Assert        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Assert.AreNotEqual(4, customers.Count());        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } &lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; [Test]       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public void SelectWithPredicate()        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; using (var session = _factory.OpenSession())        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; //Act        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; var customers = from cust in session.Linq&amp;lt;Customer&amp;gt;()        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; where cust.LastName.StartsWith(&amp;quot;St&amp;quot;)        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; select cust;        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; //Assert        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Assert.AreEqual(1, customers.Count());        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } &lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; private void SetupDatabase()       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; using (var session = _factory.OpenSession())        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Customer c = new Customer();        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; c.FirstName = &amp;quot;Mike&amp;quot;;        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; c.LastName = &amp;quot;Laroco&amp;quot;;        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; c.Address.Country = &amp;quot;USA&amp;quot;;        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; session.SaveOrUpdate(c); &lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; c = new Customer();       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; c.FirstName = &amp;quot;Bubba&amp;quot;;        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; c.LastName = &amp;quot;Stuart&amp;quot;;        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; c.Address.Country = &amp;quot;USA&amp;quot;;        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; c.Address.State = &amp;quot;Florida&amp;quot;;        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; session.SaveOrUpdate(c); &lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; c = new Customer();       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; c.FirstName = &amp;quot;Ricky&amp;quot;;        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; c.LastName = &amp;quot;Carmichael&amp;quot;;        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; c.Address.Country = &amp;quot;USA&amp;quot;;        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; c.Address.State = &amp;quot;Florida&amp;quot;;        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; session.SaveOrUpdate(c); &lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; c = new Customer();       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; c.FirstName = &amp;quot;Jean-Sebastien&amp;quot;;        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; c.LastName = &amp;quot;Roy&amp;quot;;        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; c.Address.Country = &amp;quot;Canada&amp;quot;;        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; c.Address.State = &amp;quot;Quebec&amp;quot;;        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; session.SaveOrUpdate(c); &lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; session.Flush();       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } &lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Debug.WriteLine(&amp;quot;end prepare data&amp;quot;); &lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } &lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; private void PurgeDatabase()       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; using (var session = _factory.OpenSession())        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; session.Delete(&amp;quot;from Customer&amp;quot;);        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; session.Flush();        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } &lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New"&gt;&amp;#160;&amp;#160;&amp;#160; }       &lt;br /&gt;}&lt;/font&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt; Thanks&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2504865884110659551-6546175869508638519?l=codethatworks.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codethatworks.blogspot.com/feeds/6546175869508638519/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codethatworks.blogspot.com/2009/11/linq-to-nhibernate-tutorial.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2504865884110659551/posts/default/6546175869508638519'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2504865884110659551/posts/default/6546175869508638519'/><link rel='alternate' type='text/html' href='http://codethatworks.blogspot.com/2009/11/linq-to-nhibernate-tutorial.html' title='LINQ to NHibernate Tutorial'/><author><name>Sylvain Hamel</name><uri>http://www.blogger.com/profile/02893038274559437241</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2504865884110659551.post-3759912531426011053</id><published>2009-11-05T23:59:00.002-05:00</published><updated>2009-11-14T11:50:44.924-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='NHibernate'/><title type='text'>NHibernate Tutorial</title><content type='html'>&lt;p&gt;&lt;em&gt;&lt;font face="Times New Roman" color="#3a62a3"&gt;Note: This post is based on NHibernate version 2.1.&lt;/font&gt;&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;This is a tutorial to get you started with NHibernate.&lt;/p&gt;  &lt;p&gt;At the end of this tutorial you will have:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;A class library project containing one entity &lt;/li&gt;    &lt;li&gt;A NHibernate configuration file &lt;/li&gt;    &lt;li&gt;A NHibernate mapping file to map your entities &lt;/li&gt;    &lt;li&gt;A database running on SQL Server 2005 (changing to another version of SQL server is very simple) &lt;/li&gt;    &lt;li&gt;A NUnit test project &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;1 - Create a new class library project named PocoLib in a new solution. This project will contain your entity classes.&lt;/p&gt;  &lt;p&gt;2 - In the same solution, create a new class library project called PocoLibTests&lt;/p&gt;  &lt;p&gt;3 - In the PocoLibTests project add references to &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;PocoLib project &lt;/li&gt;    &lt;li&gt;nunit.framework.dll &lt;/li&gt;    &lt;li&gt;nhibernate.dll &lt;/li&gt;    &lt;li&gt;LinFu.DynamicProxy &lt;/li&gt;    &lt;li&gt;NHibernate.ByteCode.LinFu &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;em&gt;Note: You do not have to add any references to nhibernate dlls in the PocoLib project. Your entity classes will not have any knowledge of NHibernate; they are real POCO. If you eventually use your entities in a Web app or Web Services project (most likely), it will be that app that will need those same references (except for Nunit of course).&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;4 - In PocoLibTests, rename class1.cs to CustomerCRUDTests.cs to your project.&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;font face="Courier New"&gt;using NHibernate;        &lt;br /&gt;using NHibernate.Cfg;         &lt;br /&gt;using NUnit.Framework;         &lt;br /&gt;using PocoLib; &lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New"&gt;namespace PocoLibTests        &lt;br /&gt;{         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; [TestFixture]         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; public class CustomerCRUDTests         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; { &lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; [Test]        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public void Insert()         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Customer c = new Customer()         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; { FirstName = &amp;quot;Bubba&amp;quot;, LastName = &amp;quot;Stuart&amp;quot; }; &lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; c.Address.Country = &amp;quot;USA&amp;quot;;        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; c.Address.State = &amp;quot;Florida&amp;quot;; &lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; using (ISession session = _factory.OpenSession())        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; session.SaveOrUpdate(c);         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; session.Flush();         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }         &lt;br /&gt;}&lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New"&gt;&lt;/font&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;This test does not compile for now but that gives you an idea of what we are going to work with.&lt;/p&gt;  &lt;p&gt;5 - In the PocoLib project rename class1.cs to Address.cs:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;font face="Courier New"&gt;namespace PocoLib        &lt;br /&gt;{         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; public class Address         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; private string _zipCode;         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; private string _country;         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; private string _state;         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; private string _street; &lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public string Street        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; get { return _street; }         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; set { _street = value; }         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } &lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public string State        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; get { return _state; }         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; set { _state = value; }         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } &lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public string Country        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; get { return _country; }         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; set { _country = value; }         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } &lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public string ZipCode        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; get { return _zipCode; }         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; set { _zipCode = value; }         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }         &lt;br /&gt;}&lt;/font&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;6 - In the PocoLib project add a new class named Customer.cs:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;font face="Courier New"&gt;using System;        &lt;br /&gt;using System.Collections.Generic; &lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New"&gt;namespace PocoLib        &lt;br /&gt;{         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; public class Customer         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; private int _iD;         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; private DateTime? _birthDate;         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; private string _lastName;         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; private string _firstName;         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; private Address _address = new Address();         &lt;br /&gt;&lt;/font&gt;&lt;font face="Courier New"&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public int ID        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; get { return _iD; }         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; set { _iD = value; }         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } &lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public string FirstName        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; get { return _firstName; }         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; set { _firstName = value; }         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } &lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public string LastName        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; get { return _lastName; }         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; set { _lastName = value; }         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } &lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public DateTime? BirthDate        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; get { return _birthDate; }         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; set { _birthDate = value; }         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } &lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public Address Address        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; get { return _address; }         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; set { _address = value; }         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } &lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New"&gt;&amp;#160;&amp;#160;&amp;#160; }        &lt;br /&gt;}&lt;/font&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;As you can see, the model is simple: a customer has a few properties and an Address. &lt;/p&gt;  &lt;p&gt;Note: At this point, the test project still does not compile because the _factory is not defined yet. We will define it really soon.&lt;/p&gt;  &lt;p&gt;7 - Create a new database with a Customer table&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;font face="Courier New"&gt;CREATE DATABASE PocoLib        &lt;br /&gt;GO &lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New"&gt;USE PocoLib        &lt;br /&gt;GO &lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New"&gt;CREATE TABLE [dbo].[Customer](        &lt;br /&gt;[CustomerID] [int] IDENTITY(1,1) NOT NULL,         &lt;br /&gt;[FirstName] [varchar](50) NULL,         &lt;br /&gt;[LastName] [varchar](50) NOT NULL,         &lt;br /&gt;[BirthDate] [datetime] NULL,         &lt;br /&gt;[Street] [varchar](50) NULL,         &lt;br /&gt;[State] [varchar](50) NULL,         &lt;br /&gt;[Country] [varchar](50) NULL,         &lt;br /&gt;[ZipCode] [varchar](50) NULL)         &lt;br /&gt;GO&lt;/font&gt; &lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New"&gt;&lt;/font&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Notice how we are using two classes (Customer and Address) but a single Customer table. It is much cleaner to use two classes at the class design level. But since it is a one-to-one relationship, saving the address in the same table as customer makes total sense (it's simpler, faster and feel more natural).&lt;/p&gt;  &lt;p&gt;8 - In the PocoLib project, add an xml file named PocoLib.cfg.xml. That will be your main NHibernate configuration file. It's arguable whether this file belongs to the PocoLib class library or to the host application (the test project in this case), but for now let's put it in PocoLib.&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;font face="Courier New"&gt;&amp;lt;hibernate-configuration xmlns=&amp;quot;urn:nhibernate-configuration-2.2&amp;quot;&amp;gt;        &lt;br /&gt;&amp;#160; &amp;lt;session-factory&amp;gt;         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;property name=&amp;quot;connection.provider&amp;quot;&amp;gt;         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; NHibernate.Connection.DriverConnectionProvider         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/property&amp;gt;         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;property name=&amp;quot;connection.driver_class&amp;quot;&amp;gt;         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; NHibernate.Driver.SqlClientDriver         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/property&amp;gt;         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;property name=&amp;quot;connection.connection_string&amp;quot;&amp;gt;         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Server=&lt;strong&gt;localhost&lt;/strong&gt;;database=&lt;strong&gt;PocoLib&lt;/strong&gt;;Integrated Security=SSPI;         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/property&amp;gt;         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;property name=&amp;quot;dialect&amp;quot;&amp;gt;         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; NHibernate.Dialect.MsSql2005Dialect         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/property&amp;gt;         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;property name=&amp;quot;show_sql&amp;quot;&amp;gt;         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; true         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/property&amp;gt;         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;property name='proxyfactory.factory_class'&amp;gt;         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; NHibernate.ByteCode.LinFu.ProxyFactoryFactory, NHibernate.ByteCode.LinFu         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/property&amp;gt;&amp;#160; &lt;br /&gt;&amp;#160; &amp;lt;/session-factory&amp;gt;         &lt;br /&gt;&amp;lt;/hibernate-configuration&amp;gt;&lt;/font&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;ul&gt;   &lt;li&gt;Change the connection string (line 10) if needed. &lt;/li&gt;    &lt;li&gt;If you are not on SQL Server 2005, you can change the other settings. For instance, set the dialect setting to Nibernate.Dialect.MsSql2008Dialect if your on SQL Server 2008. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;9 - In the PocoLib project, add an xml file named Customer.hbm.xml. That will be mapping file used to tell NHibernate where to persist and load our entities. (The same question about where this file should reside applies here too).&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;font face="Courier New"&gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot; ?&amp;gt;        &lt;br /&gt;&amp;lt;hibernate-mapping xmlns=&amp;quot;urn:nhibernate-mapping-2.2&amp;quot;         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; assembly=&amp;quot;PocoLib&amp;quot;         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; namespace=&amp;quot;PocoLib&amp;quot;&amp;gt; &lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New"&gt;&amp;#160; &amp;lt;class name=&amp;quot;Customer&amp;quot; lazy=&amp;quot;false&amp;quot;&amp;gt;        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;id name=&amp;quot;ID&amp;quot; column=&amp;quot;CustomerID&amp;quot;&amp;gt;         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;generator class=&amp;quot;native&amp;quot;/&amp;gt;         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/id&amp;gt;         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;property name=&amp;quot;FirstName&amp;quot;/&amp;gt;         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;property name=&amp;quot;LastName&amp;quot;/&amp;gt;         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;property name=&amp;quot;BirthDate&amp;quot;/&amp;gt;         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;component name=&amp;quot;Address&amp;quot;&amp;gt;         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;property name=&amp;quot;Street&amp;quot;/&amp;gt;         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;property name=&amp;quot;State&amp;quot;/&amp;gt;         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;property name=&amp;quot;Country&amp;quot;/&amp;gt;         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;property name=&amp;quot;ZipCode&amp;quot;/&amp;gt;         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/component&amp;gt;&amp;#160; &lt;br /&gt;&amp;#160; &amp;lt;/class&amp;gt;         &lt;br /&gt;&amp;lt;/hibernate-mapping&amp;gt;&lt;/font&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;I think the content of the file pretty much speaks for itself but here are a few things worth mentioning:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;By default, NHibernate assumes that your database column names match your class property names. &lt;/li&gt;    &lt;li&gt;The &amp;lt;id&amp;gt; element identifies the primary key column. The &amp;lt;generator class=&amp;quot;native&amp;quot;&amp;gt; indicates that SQL Server will generate the primary key value; not NHibernate. &lt;/li&gt;    &lt;li&gt;The Customer is defined as a &amp;lt;class&amp;gt; in the mapping. This is what NHibernate calls an &lt;u&gt;entity&lt;/u&gt;. &lt;/li&gt;    &lt;li&gt;The Address is declared inside the Customer as an&amp;lt;component&amp;gt; element. That basically means that the Address is a part of the Customer and it can't live without a customer. NHibernate components are also know as Value Object in Domain Driven Design. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;10 - Copy the PocoLib.cfg.xml and Customer.hbm.xml to the test library \bin\debug\ folder.&lt;/p&gt;  &lt;p&gt;11 - Add the missing _factory to the test class. Add this code at the top of the test class:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;font face="Courier New"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; private ISessionFactory _factory; &lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; [SetUp]        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public void Setup()         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Configuration configuration = new Configuration();         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; configuration.Configure(&amp;quot;PocoLib.cfg.xml&amp;quot;);         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; configuration.AddXmlFile(&amp;quot;Customer.hbm.xml&amp;quot;); &lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; _factory = configuration.BuildSessionFactory();        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/font&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;ul&gt;   &lt;li&gt;The first line create a Configuration object. &lt;/li&gt;    &lt;li&gt;The second line loads the PocoLib.cfg.xml. &lt;/li&gt;    &lt;li&gt;The 3rd line loads the mapping file for the Customer class. &lt;/li&gt;    &lt;li&gt;The 4th line create a factory that we will use to create NHibernate Sessions (a connection) &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;13 - Run the &lt;font face="Courier New"&gt;Insert()&lt;/font&gt; test. Go look in the database and be amazed (or not). Notice how SQL statements are written to the output window (If you are using Test Driven at least). You can turn that on or off by changing the &amp;lt;property name=&amp;quot;show_sql&amp;quot;&amp;gt;true&amp;lt;/property&amp;gt; in the .cfg.xml file.&lt;/p&gt;  &lt;p&gt;12 - Here are the other CRUD tests. I'm sorry but I don't feel like writing all the Asserts; this is just a test project to experiment with the CRUD operations.&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;font face="Courier New"&gt;using System.Collections.Generic;        &lt;br /&gt;using NHibernate;         &lt;br /&gt;using NHibernate.Cfg;         &lt;br /&gt;using NUnit.Framework;         &lt;br /&gt;using PocoLib; &lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New"&gt;namespace PocoLibTests        &lt;br /&gt;{         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; [TestFixture]         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; public class CustomerCRUDTests         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; private ISessionFactory _factory; &lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; [SetUp]        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public void Setup()         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Configuration configuration = new Configuration();         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; configuration.Configure(&amp;quot;PocoLib.cfg.xml&amp;quot;);         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; configuration.AddXmlFile(&amp;quot;Customer.hbm.xml&amp;quot;); &lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; _factory = configuration.BuildSessionFactory();        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } &lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; [Test]        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public void Insert()         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Customer c = new Customer()         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; { FirstName = &amp;quot;Bubba&amp;quot;, LastName = &amp;quot;Stuart&amp;quot; }; &lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; c.Address.Country = &amp;quot;USA&amp;quot;;        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; c.Address.State = &amp;quot;Florida&amp;quot;; &lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; using (ISession session = _factory.OpenSession())        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; session.SaveOrUpdate(c);         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; session.Flush();         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } &lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; [Test]        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public void Update()         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; // Arrange : Create customer in order to update it         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Customer c = new Customer()&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; { FirstName = &amp;quot;Bubba&amp;quot;, LastName = &amp;quot;Stuart&amp;quot; };         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; using (ISession session = _factory.OpenSession())         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; session.SaveOrUpdate(c);         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; session.Flush();         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; int id = c.ID; &lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; //Act : update        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; using (ISession session = _factory.OpenSession())         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; c = session.Get&amp;lt;Customer&amp;gt;(id);         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; c.FirstName = &amp;quot;James&amp;quot;;         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; session.SaveOrUpdate(c);         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; session.Flush();         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } &lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; [Test]        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public void Delete()         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; // Arrange : Create customer in order to delete it         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Customer c = new Customer()         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; { FirstName = &amp;quot;Bubba&amp;quot;, LastName = &amp;quot;Stuart&amp;quot; };         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; using (ISession session = _factory.OpenSession())         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; session.SaveOrUpdate(c);         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; session.Flush();         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; int id = c.ID; &lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; //Act : Delete        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; using (ISession session = _factory.OpenSession())         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; c = session.Get&amp;lt;Customer&amp;gt;(id);         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; session.Delete(c);         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; session.Flush();         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } &lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; [Test]        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public void Query()         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; // Arrange : Create a customer in order to query it         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Customer c = new Customer()&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; { FirstName = &amp;quot;Bubba&amp;quot;, LastName = &amp;quot;Stuart&amp;quot; };         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; using (ISession session = _factory.OpenSession())         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; session.SaveOrUpdate(c);         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; session.Flush();         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } &lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; IList&amp;lt;Customer&amp;gt; list = null; &lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; //Act:        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; using (ISession session = _factory.OpenSession())         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; list = session.CreateQuery(         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;quot;from Customer where LastName is not null&amp;quot;)         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font face="Courier New"&gt;.List&amp;lt;Customer&amp;gt;();        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } &lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; //Assert:        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Assert.AreNotEqual(0, list.Count); &lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } &lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New"&gt;&amp;#160;&amp;#160;&amp;#160; }        &lt;br /&gt;}&lt;/font&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;I hope this helps.&lt;/p&gt;  &lt;p&gt;BTW: I started learning NHibernate just a few days ago. I'm wrote this post to serialize what I have learned so far (and hopefully help people at the same time). I'm sure this approach is not ideal. If you have comments on how I could improve this tutorial, just let me know. &lt;/p&gt;  &lt;p&gt;Thanks   &lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2504865884110659551-3759912531426011053?l=codethatworks.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codethatworks.blogspot.com/feeds/3759912531426011053/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codethatworks.blogspot.com/2009/11/getting-started-with-nhibernate.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2504865884110659551/posts/default/3759912531426011053'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2504865884110659551/posts/default/3759912531426011053'/><link rel='alternate' type='text/html' href='http://codethatworks.blogspot.com/2009/11/getting-started-with-nhibernate.html' title='NHibernate Tutorial'/><author><name>Sylvain Hamel</name><uri>http://www.blogger.com/profile/02893038274559437241</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2504865884110659551.post-6160787817844953771</id><published>2009-11-01T12:21:00.001-05:00</published><updated>2009-11-01T12:21:46.547-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='monotouch'/><title type='text'>Monotouch debugger now avaliable</title><content type='html'>&lt;p&gt;This very short post is simply to announce that monotouch now has a debugger (breakpoints, watch) that works on the device and in the simulator.&lt;/p&gt;  &lt;p&gt;Kudos to the monotouch team!&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2504865884110659551-6160787817844953771?l=codethatworks.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codethatworks.blogspot.com/feeds/6160787817844953771/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codethatworks.blogspot.com/2009/11/monotouch-debugger-now-avaliable.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2504865884110659551/posts/default/6160787817844953771'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2504865884110659551/posts/default/6160787817844953771'/><link rel='alternate' type='text/html' href='http://codethatworks.blogspot.com/2009/11/monotouch-debugger-now-avaliable.html' title='Monotouch debugger now avaliable'/><author><name>Sylvain Hamel</name><uri>http://www.blogger.com/profile/02893038274559437241</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2504865884110659551.post-248684414240422273</id><published>2009-11-01T12:17:00.002-05:00</published><updated>2009-11-01T12:48:10.940-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='html-css-jquery'/><title type='text'>jQuery plug-in to fix the width=100% problem</title><content type='html'>&lt;p&gt;While making the layout for a new app I’m writing, I discovered what I call the &lt;strong&gt;&lt;em&gt;Box model 100% width bug&lt;/em&gt;&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;The box model spec states that the resulting width of an element whose width is 100% will equal to:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;calculated width = (inner width of parent) + (element's padding) + (element's margin)&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;That means that given this html:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;font face="Courier New"&gt;&amp;lt;div id=&amp;quot;container&amp;quot; style=&amp;quot;width:400px;&amp;quot;&amp;gt;        &lt;br /&gt;&amp;#160; &amp;lt;div id=&amp;quot;div1&amp;quot;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; style=&amp;quot;background-color:Green; width:100%; margin-left:10px; padding-left:10px;&amp;quot;&amp;gt;         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Lorem ipsum dolor sit amet, consectetur adipisicing elit...         &lt;br /&gt;&amp;#160; &amp;lt;/div&amp;gt;         &lt;br /&gt;&amp;lt;/container&amp;gt;&lt;/font&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;The div1 's total width will be &lt;strong&gt;420px&lt;/strong&gt;; not &lt;strong&gt;400px &lt;/strong&gt;as you would want. &lt;/p&gt;  &lt;p&gt;A solution is to compensate by wrapping div1 in a container that has a padding-left equal to the element's (2 * margin) + (padding):&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;font face="Courier New"&gt;&amp;lt;div id=&amp;quot;container&amp;quot; style=&amp;quot;width:400px;&amp;quot;&amp;gt;        &lt;br /&gt;&amp;#160; &amp;lt;div id=&amp;quot;wrapper&amp;quot; style=&amp;quot;padding-left:30px;&amp;quot;&amp;gt;         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;div id=&amp;quot;div1&amp;quot;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; style=&amp;quot;background-color:Green; width:100%; margin-left:10px; padding-left:10px;&amp;quot;&amp;gt;         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Lorem ipsum dolor sit amet, consectetur adipisicing elit...         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/div&amp;gt;         &lt;br /&gt;&amp;#160; &amp;lt;/div&amp;gt;         &lt;br /&gt;&amp;lt;/container&amp;gt;&lt;/font&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Why add an extra element instead of modifying the container div? Because in a real cases, the container div will probably be many levels above the element that you are trying to style. The wrapper div used to compensate should be the immediate parent of that element.&lt;/p&gt;  &lt;p&gt;I wrote a jQuery plugin to automatically inject the wrapper div to elements. Here is how to use it:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;font face="Courier New"&gt;$(function() {        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; $(&amp;quot;#div1&amp;quot;).fixFullWidth();         &lt;br /&gt;})&lt;/font&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;The plug-in iterates&amp;#160; through at all elements selected by the jQuery selector and wraps each of them in a div that has the correct padding-left value.&lt;/p&gt;  &lt;p&gt;Here is the plug-in source. BTW, I'm not a javascript expert so if you come up with a better implementation just let me know and I will update this post.&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;font face="Courier New"&gt;$.fn.fixFullWidth = function() {        &lt;br /&gt;&lt;/font&gt;&lt;font face="Courier New"&gt;&amp;#160;&amp;#160;&amp;#160; //create the endsWith function of the String type        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; String.prototype.endsWith = function(str) {         &lt;br /&gt;&lt;/font&gt;&lt;font face="Courier New"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return (this.match(str + &amp;quot;$&amp;quot;) == str);        &lt;br /&gt;&lt;/font&gt;&lt;font face="Courier New"&gt;&amp;#160;&amp;#160;&amp;#160; }        &lt;br /&gt;&lt;/font&gt;&lt;font face="Courier New"&gt;       &lt;br /&gt;&amp;#160;&amp;#160; this.each(function() {         &lt;br /&gt;&lt;/font&gt;&lt;font face="Courier New"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; var elemMarginValue = $(this).css('margin-left');        &lt;br /&gt;&lt;/font&gt;&lt;font face="Courier New"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; var elemMargin = 0;        &lt;br /&gt;&lt;/font&gt;&lt;font face="Courier New"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (elemMarginValue.endsWith(&amp;quot;px&amp;quot;)) {        &lt;br /&gt;&lt;/font&gt;&lt;font face="Courier New"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; elemMargin = parseInt( elemMarginValue.replace('px', ''));        &lt;br /&gt;&lt;/font&gt;&lt;font face="Courier New"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }        &lt;br /&gt;&lt;/font&gt;&lt;font face="Courier New"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; var elemPaddingValue = $(this).css('padding-left');        &lt;br /&gt;&lt;/font&gt;&lt;font face="Courier New"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; var elemPadding = 0;        &lt;br /&gt;&lt;/font&gt;&lt;font face="Courier New"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (elemPaddingValue.endsWith(&amp;quot;px&amp;quot;)) {        &lt;br /&gt;&lt;/font&gt;&lt;font face="Courier New"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; elemPadding = parseInt( elemPaddingValue.replace('px', ''));        &lt;br /&gt;&lt;/font&gt;&lt;font face="Courier New"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }        &lt;br /&gt;&lt;/font&gt;&lt;font face="Courier New"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; var padding_left = (elemMargin * 2) + elemPadding;        &lt;br /&gt;&lt;/font&gt;&lt;font face="Courier New"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (padding_left != 0) {        &lt;br /&gt;&lt;/font&gt;&lt;font face="Courier New"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; $(this).wrap('&amp;lt;div class=&amp;quot;fixFullWidth&amp;quot; style=&amp;quot;padding-right:' + padding_left + 'px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;');        &lt;br /&gt;&lt;/font&gt;&lt;font face="Courier New"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }        &lt;br /&gt;&lt;/font&gt;&lt;font face="Courier New"&gt;&amp;#160;&amp;#160;&amp;#160; });        &lt;br /&gt;&lt;/font&gt;&lt;font face="Courier New"&gt;&amp;#160;&amp;#160;&amp;#160; return this;        &lt;br /&gt;&lt;/font&gt;&lt;font face="Courier New"&gt;};&lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;I hope this helps. &lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2504865884110659551-248684414240422273?l=codethatworks.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codethatworks.blogspot.com/feeds/248684414240422273/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codethatworks.blogspot.com/2009/11/jquery-plug-in-to-fix-width100-problem.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2504865884110659551/posts/default/248684414240422273'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2504865884110659551/posts/default/248684414240422273'/><link rel='alternate' type='text/html' href='http://codethatworks.blogspot.com/2009/11/jquery-plug-in-to-fix-width100-problem.html' title='jQuery plug-in to fix the width=100% problem'/><author><name>Sylvain Hamel</name><uri>http://www.blogger.com/profile/02893038274559437241</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2504865884110659551.post-855306981468185556</id><published>2009-10-03T14:14:00.008-04:00</published><updated>2009-10-03T23:46:54.761-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='monotouch'/><category scheme='http://www.blogger.com/atom/ns#' term='iphone'/><title type='text'>How to fix MonoDevelop code completion problem?</title><content type='html'>At the time of this post, there is a known issue with MonoDevelop's Code Completions feature. At some point, code completion stops working and you get "Gathering class information..." in the code completion drop down list.&lt;br /&gt;&lt;br /&gt;Before you apply this workaround, ensure that you have the latest build of MonoDevelop.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Workaround: Manually clear the code completion cache&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;On a Mac:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Close MonoDevelop &lt;/li&gt;&lt;li&gt;Open the Terminal application&lt;/li&gt;&lt;li&gt;Run this command: &lt;code&gt;rm -r ~/.config/MonoDevelop/CodeCompletionData&lt;/code&gt;&lt;/li&gt;&lt;li&gt;Restart MonoDevelop &lt;/li&gt;&lt;/ul&gt;Note: For some reason, it did not work on my first attempt. MonoDevelop was still "Gathering class information", I listed the content of the CodeCompletionData folder and no files would appear. I did the same procedure again and it worked. So you might have to do this more than once.&lt;br /&gt;&lt;br /&gt;I hope this helps.&lt;br /&gt;&lt;br /&gt;Thanks to @mikebluestein and @mikrueger on twitter for their help.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2504865884110659551-855306981468185556?l=codethatworks.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codethatworks.blogspot.com/feeds/855306981468185556/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codethatworks.blogspot.com/2009/10/how-to-fix-monodevelop-code-completion.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2504865884110659551/posts/default/855306981468185556'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2504865884110659551/posts/default/855306981468185556'/><link rel='alternate' type='text/html' href='http://codethatworks.blogspot.com/2009/10/how-to-fix-monodevelop-code-completion.html' title='How to fix MonoDevelop code completion problem?'/><author><name>Sylvain Hamel</name><uri>http://www.blogger.com/profile/02893038274559437241</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2504865884110659551.post-4255744198497290451</id><published>2009-09-29T12:37:00.011-04:00</published><updated>2009-10-03T14:49:45.351-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='monotouch'/><category scheme='http://www.blogger.com/atom/ns#' term='iphone'/><title type='text'>iPhone programming in C# with MonoTouch</title><content type='html'>Two weeks ago Novell released MonoTouch (www.monotouch.net), a SDK to develop in .Net for the iPhone.&lt;br /&gt;&lt;br /&gt;I started programming with MonoTouch two days ago. So far I must say I'm impressed. I had absolutely no experience on a Mac before.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Here is a summary of the experience with MonoTouch:&lt;br /&gt;&lt;br /&gt;- You need a Mac on which you install:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt; iPhone SDK from Apple (iPhone Library and Interface Builder)&lt;/li&gt;&lt;li&gt; Mono Framework&lt;/li&gt;&lt;li&gt; MonoDevelop IDE&lt;/li&gt;&lt;li&gt; MonoTouch SDK&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;- You create user interfaces using Interface Builder, the standard User Interface designer program for Mac/iPhone apps that is part of the SDK.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;- You code your logic in C# using an IDE called MonoDevelop which is somewhat similar to Visual Studio and includes code completion. You have access to the C# 3.0 (LINQ, Lambda, Generics) features, Garbage Collection (not offered in the native iPhone SDK) and most general purpose .net APIs. They have wrapped a large portion of the iPhone SDK with a C# friendly API style.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Overall, the experience is quite good. There is one important issue though; there is no debugger (no breakpoints, no watch window, no call stack). You must debug using Console.WriteLine(). I hope Novell will find a way to debug in an upcoming release.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;-Sly&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2504865884110659551-4255744198497290451?l=codethatworks.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codethatworks.blogspot.com/feeds/4255744198497290451/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codethatworks.blogspot.com/2009/09/iphone-programming-in-c.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2504865884110659551/posts/default/4255744198497290451'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2504865884110659551/posts/default/4255744198497290451'/><link rel='alternate' type='text/html' href='http://codethatworks.blogspot.com/2009/09/iphone-programming-in-c.html' title='iPhone programming in C# with MonoTouch'/><author><name>Sylvain Hamel</name><uri>http://www.blogger.com/profile/02893038274559437241</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2504865884110659551.post-7348255251409683533</id><published>2008-11-28T19:08:00.004-05:00</published><updated>2009-11-01T12:37:52.798-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='unity'/><title type='text'>Unity Application Block Tutorial</title><content type='html'>&lt;p&gt;This article explains how to get started with the Unity Application Block using a simple console application. Throughout this tutorial you will learn how to configure and use the &amp;quot;Inversion of Control&amp;quot; and &amp;quot;Dependency Injection&amp;quot; features of the Unity Application Block.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Assumptions&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;This article assumes that:&lt;/p&gt;  &lt;p&gt;You know what DIP, IoC and DI are.   &lt;br /&gt;You want to configure your type mappings using a configuration file; not using code.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Container&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;The &amp;quot;Container&amp;quot; or &amp;quot;Inversion of Control Container&amp;quot; is the main object that is used to create objects and inject dependencies into them. Whenever you want an object to be open to IoC, you have to use the container to create the instance using container.Resolve&amp;lt;T&amp;gt;() method instead of the &amp;quot;new&amp;quot; keyword. &lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New"&gt;IService service = unityContainer.Resolve&amp;lt; IService&amp;gt;();&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;Create the project and add references to the required assemblies&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Create a new console project called UnityTest (if you use another name, you will have to change type names in configuration files so I recommend you stick to this name).&lt;/li&gt;    &lt;li&gt;Add references to the following assemblies:&lt;/li&gt;    &lt;ul&gt;     &lt;li&gt;System.Configuration&lt;/li&gt;      &lt;li&gt;Microsoft.Practices.ObjectBuilder2&lt;/li&gt;      &lt;li&gt;Microsoft.Practices.Unity&lt;/li&gt;      &lt;li&gt;Microsoft.Practices.Unity.Configuration&lt;/li&gt;   &lt;/ul&gt; &lt;/ul&gt;  &lt;p&gt;Create the application configuration file&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Add App.config configuration file to your project&lt;/li&gt;    &lt;li&gt;Enter the following code in the App.config file&lt;/li&gt; &lt;/ul&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;font face="Courier New"&gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot; ?&amp;gt; &lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New"&gt;&amp;lt;configuration&amp;gt; &lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New"&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;configSections&amp;gt; &lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;section&lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; name=&amp;quot;unity&amp;quot;&lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; type=&amp;quot;Microsoft.Practices.Unity.Configuration.UnityConfigurationSection, &lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Microsoft.Practices.Unity.Configuration&amp;quot; /&amp;gt; &lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New"&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/configSections&amp;gt; &lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New"&gt;&amp;lt;unity&amp;gt; &lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New"&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;containers&amp;gt; &lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New"&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;container&amp;gt; &lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New"&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;types&amp;gt; &lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New"&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/types&amp;gt; &lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New"&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/container&amp;gt; &lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New"&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/containers&amp;gt; &lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New"&gt;&amp;lt;/unity&amp;gt; &lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New"&gt;&amp;lt;/configuration&amp;gt;&lt;/font&gt; &lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;This is the smallest working configuration file you can have for Unity to work. There is one configSections element that describes how .Net should read the upcoming section.   &lt;br /&gt;There is one, empty, container configuration nested in a containers, nested in a sections called &amp;quot;unity&amp;quot;. With this configuration, your will be able to create and configure the container object and then use the container to create objects.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Create and configure the UnityContainer instance&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;In your project's Main() method, add the following code to create a container instance and configure it by reading the &amp;quot;unity&amp;quot; configuration section defined in the app.config file.&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;font face="Courier New"&gt;static void Main(string[] args) &lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New"&gt;{ &lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New"&gt;&amp;#160;&amp;#160;&amp;#160; IUnityContainer container = new UnityContainer(); &lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New"&gt;&amp;#160;&amp;#160;&amp;#160; UnityConfigurationSection section = &lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New"&gt;&amp;#160;&amp;#160;&amp;#160; (UnityConfigurationSection)ConfigurationManager.GetSection(&amp;quot;unity&amp;quot;); &lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New"&gt;&amp;#160;&amp;#160;&amp;#160; section.Containers.Default.Configure(container); &lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New"&gt;}&lt;/font&gt; &lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;That's it. You can now create instances using container.Resolve&amp;lt;T&amp;gt;() for any type. As you will see, the container is able to Resolve any type, even if no type mapping exist in the configuration file. If you give it a concrete type, it will simply create an instance of that type and return it to you. You can later add a type mapping for that type and the real IoC benefits will be introduced automatically.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Create an instance and inject dependencies&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Add these 3 types to your project. &lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;font face="Courier New"&gt;public class InvoiceManager &lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New"&gt;{ &lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New"&gt;&amp;#160;&amp;#160;&amp;#160; private IInvoicingService _invoicingService; &lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New"&gt;&amp;#160;&amp;#160;&amp;#160; public InvoiceManager(IInvoicingService invoicingService) &lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New"&gt;&amp;#160;&amp;#160;&amp;#160; { &lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; _invoicingService = invoicingService; &lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New"&gt;&amp;#160;&amp;#160;&amp;#160; } &lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New"&gt;&amp;#160;&amp;#160;&amp;#160; public void Manage() &lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New"&gt;&amp;#160;&amp;#160;&amp;#160; { &lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Console.WriteLine(_invoicingService.GetCount()); &lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New"&gt;&amp;#160;&amp;#160;&amp;#160; } &lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New"&gt;&amp;#160;&amp;#160;&amp;#160; } &lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New"&gt;&amp;#160;&amp;#160;&amp;#160; public interface IInvoicingService &lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New"&gt;&amp;#160;&amp;#160;&amp;#160; { &lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font face="Courier New"&gt;string GetCount(); &lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font face="Courier New"&gt;} &lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font face="Courier New"&gt;public class InvoicingService : IInvoicingService &lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font face="Courier New"&gt;{ &lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font face="Courier New"&gt;public InvoicingService() &lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font face="Courier New"&gt;{ &lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font face="Courier New"&gt;} &lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font face="Courier New"&gt;public string GetCount() &lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font face="Courier New"&gt;{ &lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font face="Courier New"&gt;return DateTime.Now.ToString(); &lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New"&gt;&amp;#160;&amp;#160;&amp;#160; } &lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New"&gt;} &lt;/font&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Take a minute to study the dependencies: An InvoiceManager uses (depends on) an IInvoiceService. The class InvoicingService it the concrete implementation for IInvoiceService.&lt;/p&gt;  &lt;p&gt;Add a type mapping in the App.config file. Change the content of the &amp;lt;unity&amp;gt; section this way:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;font face="Courier New"&gt;&amp;lt;containers&amp;gt; &lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New"&gt;&amp;lt;container&amp;gt; &lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New"&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;types&amp;gt; &lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;type type =&amp;quot;UnityTest.IInvoicingService, UnityTest&amp;quot; &lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; mapTo=&amp;quot;UnityTest.InvoicingService, UnityTest&amp;quot;&amp;gt; &lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/type&amp;gt; &lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New"&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/types&amp;gt; &lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New"&gt;&amp;lt;/container&amp;gt; &lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New"&gt;&amp;lt;/containers&amp;gt;&lt;/font&gt; &lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;- Append these lines to your Main() function without changing the existing lines that create and configure the container. &lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;font face="Courier New"&gt;IInvoicingService service = container.Resolve&amp;lt;IInvoicingService&amp;gt;(); &lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New"&gt;console.WriteLine( service.GetCount()); &lt;/font&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;- Run the project and see the result. &lt;/p&gt;  &lt;p&gt;The container returns an InvoiceService when asked to resolve the type IInvoiceService. &lt;/p&gt;  &lt;p&gt;- Delete the two new lines and replace them by the following two lines:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;font face="Courier New"&gt;InvoiceManager manager = container.Resolve&amp;lt;InvoiceManager&amp;gt;(); &lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New"&gt;manager.Manage();&lt;/font&gt; &lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;- Run the project and see the result. &lt;/p&gt;  &lt;p&gt;Although the InvoiceManager class is not configured in the App.config file, it is still participating in Dependency Injection. When asked to resolve the type InvoiceManager, the UnityContainer did not find any mapping to use to substitute InvoiceManager by something else. However, the UnityContainer analyzed the constructor of InvoiceManager and found that InvoiceManager has a dependency on IInvoicingService. So the UnityContainer resolved IInvoicingService into an InvoiceService and then passed it to the InvoiceManager constructor.&lt;/p&gt;  &lt;p&gt;If you are curious, add breakpoints to the InvoiceService and InvoiceManager constructors and run the program. Notice in which order objects are created. Have a look at the call stack windows just to have an idea of what is happening under the hood.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Lifetime management&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;The UnityContainer is able to manage the lifetime of the objects it resolves. By default, the UnityContainer creates a new instance of any type it resolves. You can prove this with this unit test:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;font face="Courier New"&gt;IInvoicingService service1 = container.Resolve&amp;lt;IInvoicingService&amp;gt;(); &lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New"&gt;IInvoicingService service2 = container.Resolve&amp;lt;IInvoicingService&amp;gt;(); &lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New"&gt;Assert.AreNotSame( service1, service2 );&lt;/font&gt; &lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;There are 4 basic options for lifetime management:&lt;/p&gt;  &lt;p&gt;No management: The container does not keep a reference on the objects it creates and therefore creates a new object each time Resolve&amp;lt;T&amp;gt;() is called.   &lt;br /&gt;Singleton: The container always returns the same instance    &lt;br /&gt;Singleton-per-thread: The container keeps one instance for each thread and return the instance based on the current thread.    &lt;br /&gt;Externally controlled: You provide a class that will manage the instances. This option is not covered in this article.&lt;/p&gt;  &lt;p&gt;&lt;u&gt;Lifetime management configuration&lt;/u&gt;&lt;/p&gt;  &lt;p&gt;The configuration of lifetime management is done at the &amp;lt;type&amp;gt; level. Each lifetime management option is supported by one type (class) in the unity application block library. &lt;/p&gt;  &lt;p&gt;For example, the class ContainerControlledLifetimeManager is the class that implements the &amp;quot;singleton&amp;quot; lifetime management style. &lt;/p&gt;  &lt;p&gt;- To resolve the IInvoicingService type using a singleton, change the &amp;lt;type&amp;gt; section this way:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;font face="Courier New"&gt;&amp;lt;type type=&amp;quot;UnityTest.IInvoicingService, UnityTest&amp;quot; &lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; mapTo=&amp;quot;UnityTest.InvoicingService, UnityTest&amp;quot;&amp;gt; &lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New"&gt;&amp;lt;lifetime type= &amp;quot;Microsoft.Practices.Unity.ContainerControlledLifetimeManager, &lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New"&gt;Microsoft.Practices.Unity&amp;quot; /&amp;gt; &lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New"&gt;&amp;lt;/type&amp;gt;&lt;/font&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;&lt;u&gt;Lifetime management using aliases&lt;/u&gt;&lt;/p&gt;  &lt;p&gt;Using the fully qualified name for the ContainerControlledLifetimeManager class can make files hard to read. The configuration section for unity supports defining aliases. The aliases can then be used anywhere a type name is expected. I recommend defining 3 aliases for the 3 types of lifetime management option.&lt;/p&gt;  &lt;p&gt;- Inside the &amp;lt;unity&amp;gt; section (but above and outside the &amp;lt;containers&amp;gt; sections, add the following alias definitions:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;font face="Courier New"&gt;&amp;lt;typeAliases&amp;gt; &lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New"&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;typeAlias alias=&amp;quot;singleton&amp;quot; &lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; type=&amp;quot;Microsoft.Practices.Unity.ContainerControlledLifetimeManager, &lt;/font&gt;&lt;font face="Courier New"&gt;Microsoft.Practices.Unity&amp;quot; /&amp;gt; &lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New"&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New"&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;typeAlias alias=&amp;quot;perThread&amp;quot; &lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; type=&amp;quot;Microsoft.Practices.Unity.PerThreadLifetimeManager, &lt;/font&gt;&lt;font face="Courier New"&gt;Microsoft.Practices.Unity&amp;quot; /&amp;gt; &lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New"&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New"&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;typeAlias alias=&amp;quot;external&amp;quot; &lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; type=&amp;quot;Microsoft.Practices.Unity.ExternallyControlledLifetimeManager, &lt;/font&gt;&lt;font face="Courier New"&gt;Microsoft.Practices.Unity&amp;quot; /&amp;gt; &lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New"&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New"&gt;&amp;lt;/typeAliases&amp;gt;&lt;/font&gt; &lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;- You can now simplify the &amp;lt;type&amp;gt; declaration for IInvoicingService this way:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;font face="Courier New"&gt;&amp;lt;type type=&amp;quot;UnityTest.IInvoicingService, UnityTest&amp;quot; &lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New"&gt;&amp;#160;&amp;#160;&amp;#160; mapTo=&amp;quot;UnityTest.InvoicingService, UnityTest&amp;quot;&amp;gt; &lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New"&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;lifetime type=&amp;quot;singleton&amp;quot; /&amp;gt; &lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New"&gt;&amp;lt;/type&amp;gt;&lt;/font&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Tip: You can also define aliases the same way for your own types if you would like to simplify the type mapping for your own type.&lt;/p&gt;  &lt;p&gt;Tip: You can also specify a lifetime for type that does not have a mapping. In this case, add a &amp;lt;type&amp;gt; section for that type but do not add a mapTo attribute. Then add the &amp;lt;lifetime&amp;gt; element to that type.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Other methods for injecting dependencies&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;So far, we have seen that the UnityContainer can inject dependencies by analyzing the constructor of a type and passing the necessary dependencies to it. In this section, we will see how dependencies can be injected using other mechanisms.&lt;/p&gt;  &lt;p&gt;&lt;u&gt;Dependency injection by property assignment&lt;/u&gt;&lt;/p&gt;  &lt;p&gt;- Add these two classes to your project:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;font face="Courier New"&gt;public interface ICustomerService &lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New"&gt;{ &lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New"&gt;&amp;#160;&amp;#160;&amp;#160; string GetCustomer(); &lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New"&gt;} &lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New"&gt;public class CustomerService : ICustomerService &lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New"&gt;{ &lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New"&gt;&amp;#160;&amp;#160;&amp;#160; public string GetCustomer() &lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New"&gt;&amp;#160;&amp;#160;&amp;#160; { &lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return &amp;quot;Sylvain Hamel&amp;quot;; &lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New"&gt;&amp;#160;&amp;#160;&amp;#160; } &lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New"&gt;}&lt;/font&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;- Add the following type mapping into the configuration file:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;font face="Courier New"&gt;&amp;lt;type type=&amp;quot;UnityTest.ICustomerService, UnityTest&amp;quot; &lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; mapTo=&amp;quot;UnityTest.CustomerService, UnityTest&amp;quot;&amp;gt; &lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New"&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;lifetime type=&amp;quot;singleton&amp;quot; /&amp;gt; &lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New"&gt;&amp;lt;/type&amp;gt; &lt;/font&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;- Change the InvoiceManager by adding a new Property of type ICustomerService:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;font face="Courier New"&gt;private ICustomerService _customerService; &lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New"&gt;[Dependency] &lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New"&gt;public ICustomerService CustomerService &lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New"&gt;{ &lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New"&gt;&amp;#160;&amp;#160;&amp;#160; get { return _customerService; } &lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New"&gt;&amp;#160;&amp;#160;&amp;#160; set { _customerService = value; } &lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New"&gt;}&lt;/font&gt; &lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Notice the use of the [Dependency] attribute. This will indicate to the UnityContainer that a dependency injection is required here.&lt;/p&gt;  &lt;p&gt;- Change the Manage() method of the InvoiceManager this way&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;font face="courier "&gt;public void Manage() &lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="courier "&gt;{ &lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="courier "&gt;&amp;#160;&amp;#160;&amp;#160; Console.WriteLine(_invoicingService.GetCount()); &lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="courier "&gt;&amp;#160;&amp;#160;&amp;#160; Console.WriteLine(_customerService.GetCustomer()); &lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="courier "&gt;} &lt;/font&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;- Run the project.&lt;/p&gt;  &lt;p&gt;As you probably expected, the program did resolve ICustomerService and injected a CustomerService instance into the InvoiceManager.CustomerService property.&lt;/p&gt;  &lt;p&gt;&lt;u&gt;Dependency injection by method call&lt;/u&gt;&lt;/p&gt;  &lt;p&gt;You can do pretty much the same thing using a method call instead of a property.&lt;/p&gt;  &lt;p&gt;- Replace the CustomerService the property by a SetCustomerService() method:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;font face="Courier New"&gt;[InjectionMethod] &lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New"&gt;public void SetCustomerService(ICustomerService service) &lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New"&gt;{ &lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New"&gt;&amp;#160;&amp;#160;&amp;#160; _customerService = service; &lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New"&gt;}&lt;/font&gt; &lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;In the case of a method, use the [InjectionMethod] attribute to indicate to UnityContainer that a dependency injection is required.&lt;/p&gt;  &lt;p&gt;- Run the project.&lt;/p&gt;  &lt;p&gt;And of course, the program did resolve ICustomerService and injected a CustomerService instance by calling the InvoiceManager.SetCustomerService method.&lt;/p&gt;  &lt;p&gt;&lt;u&gt;Note on dependency injection by constructor&lt;/u&gt;&lt;/p&gt;  &lt;p&gt;We have already seen dependency injection through the constructor but there is one important note about this: If your class has multiple constructors, your must annotate the constructor you want UnityContainer to use by adding the [InjectionConstructor] attribute on it.&lt;/p&gt;  &lt;p&gt;Conclusion&lt;/p&gt;  &lt;p&gt;Hopefully this tutorial will you get started with the Unity Application Block. &lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2504865884110659551-7348255251409683533?l=codethatworks.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codethatworks.blogspot.com/feeds/7348255251409683533/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codethatworks.blogspot.com/2008/11/unity-application-block-21-tutorial.html#comment-form' title='9 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2504865884110659551/posts/default/7348255251409683533'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2504865884110659551/posts/default/7348255251409683533'/><link rel='alternate' type='text/html' href='http://codethatworks.blogspot.com/2008/11/unity-application-block-21-tutorial.html' title='Unity Application Block Tutorial'/><author><name>Sylvain Hamel</name><uri>http://www.blogger.com/profile/02893038274559437241</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>9</thr:total></entry></feed>
