Monday, 25 August 2008

Configuration changes in NHibernate 2.0

I downloaded NHibernate 2.0 today and started to play around with it, only to be greeted by a host of configuration errors like System.InvalidOperationException : Could not find the dialect in the configuration. It was then I remembered reading somewhere about some changes to the configuration syntax, so I downloaded the source and looked at the examples (after a brief, ill-fated search for NHibernate 2.0-specific documentation*).

* Update 2008-08-26: Fabio has published a knol on NH2.0. Chapter 3 covers configuration.

Here is an example of how an App.config looked for NHibernate 1.2:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <section name="nhibernate" type="System.Configuration.NameValueSectionHandler, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
  </configSections>
  <nhibernate>
    <add key="hibernate.connection.provider" value="NHibernate.Connection.DriverConnectionProvider" />
    <add key="hibernate.dialect" value="NHibernate.Dialect.MsSql2005Dialect" />
    <add key="hibernate.connection.driver_class" value="NHibernate.Driver.SqlClientDriver" />
    <add key="hibernate.connection.connection_string" value="Data Source=127.0.0.1\SQLEXPRESS;Initial Catalog=DbWorkshop;Integrated Security=True" />
  </nhibernate>
</configuration>

And here is the equivalent for version 2.0:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <section name="hibernate-configuration" type="NHibernate.Cfg.ConfigurationSectionHandler, NHibernate" />
  </configSections>
  <hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">
    <session-factory>
      <property name="connection.provider">NHibernate.Connection.DriverConnectionProvider</property>
      <property name="dialect">NHibernate.Dialect.MsSql2005Dialect</property>
      <property name="connection.driver_class">NHibernate.Driver.SqlClientDriver</property>
      <property name="connection.connection_string">Data Source=127.0.0.1\SQLEXPRESS;Initial Catalog=DbWorkshop;Integrated Security=True</property>
    </session-factory>
  </hibernate-configuration>
</configuration>

The main changes are:

  • We aren't using an nhibernate configuration section, it's hibernate-configuration now (yay for more typing! :P).
  • We now have a session-factory child node for adding the configuration properties.
  • We aren't adding properties using the <add key="..." value="..." /> syntax. Instead we are using <property name="...">(property value)</property>.
  • The property names aren't prefixed by "hibernate" anymore, so "hibernate.connection.provider" becomes "connection.provider".

Moral of the story is to check the source first -- the NHibernate.Examples folder is filled with helpful goodies. :) Svend Tofte also has a helpful post on setting up NHibernate 2.0.


Share/Save/Bookmark

6 comments:

Anonymous said...

Thanks Dave,

this has really helped me sort out the same problem in our factory configuration, though just using the config properties collection rather than xml config files.

Theo,
Kenya

David said...

Great! I didn't think I'd be the only one to be caught by this. Glad you found the post and that it helped. :)

Cheers,
David

aline said...

Thanks for your help!
By upgrading from NHibernate 1.2, I also had to add this config line:

property name="cache.use_second_level_cache">false

because I was getting this exception:

NHibernate.Cache.NoCachingEnabledException: Second-level cache is enabled, but no cache provider was selected.


If it can help anyone...

David said...

Thanks Aline :)

Anonymous said...

Thanks for the post, it really helped me out. I was following an example that used the old mapping and I had NHibernate 2 installed. Took me some time to get it working but all working now, thanks again

David said...

@Anonymous #2, glad it helped! :)