The McDev Blog

Kevin McKelvin's perspective of the Ruby world.

Introducing NHibernate 3 (Devs4Devs)

Thanks to all who attended my 20 minute introduction to NHibernate 3 this morning. Here are my slides from the presentation

Introducing_NHibernate3.pptx

And the code samples:

Loquacious SessionFactory configuration

1
2
3
4
5
6
7
8
9
10
11
12
13
14
var config = new Configuration();

config.DataBaseIntegration(db =>
                         {
                             db.ConnectionStringName = "ConnectionString";
                             db.Dialect<MsSql2008Dialect>();
                         })
  .Proxy(p => p.ProxyFactoryFactory<ProxyFactoryFactory>())
  .SetProperty(NHibernate.Cfg.Environment.CurrentSessionContextClass, "web")
  .AddAssembly(typeof (Artist).Assembly);

HibernatingRhinos.Profiler.Appender.NHibernate.NHibernateProfiler.Initialize();

return config.BuildSessionFactory();

Querying the Music Store

1
2
3
4
5
6
7
8
9
10
11
12
13
IMusicStoreContext context = MvcApplication.GetCurrentRequestSession();

using (var tx = context.Session.BeginTransaction(IsolationLevel.ReadUncommitted))
{
    var artists = (from artist in context.Artists
                  where artist.Name.StartsWith("a")
                  orderby artist.Name descending
                  select artist).Fetch(x => x.Albums).ToList();

    tx.Commit();

    return View(artists);
}

One change I’ve made here is the call to .ToList() when selecting the artists. By enumerating the collection, we’re forcing NHibernate to get the objects from the database - to ensure that the select happens inside the transaction boundary.

The View code

1
2
3
4
5
6
7
8
9
10
<% foreach (var artist in Model)
   { %>

   <tr>
   <td><%: artist.Name %></td>
   <td><%: string.Join(", ", artist.Albums.Select(a => a.Title)) %></td>
   </tr>

<%
   } %>