Estuve trabajando creando una solución .NET que contiene un ejemplo mínimo de NHibernate 2.x. Estoy usando la distribución binaria NHibernate GA 2.0.1, siguiendo las instrucciones del manual de referencia.
Pueden bajarse el código fuente de la solución de mi Skydrive:
NHibernateExample1.zip
Estuve usando la documentación en línea de
http://nhforge.org/doc/nh/en/
y armé el mismo manual en formato .pdf, usando comandos del trunk de SVN:
https://nhibernate.svn.sourceforge.net/svnroot/nhibernate
Si quieren, pueden bajar el manual en .pdf de este enlace:
nhibernate-reference.pdf
La solución contiene dos proyectos: una librería de clases, y una aplicación de consola:

El dominio sólo contiene una clase, Cat (estoy siguiendo el primer ejemplo que se describe en la documentación):
namespace NHibernateExample1.Domain
{
public class Cat
{
private string id;
private string name;
private char sex;
private float weight;
public Cat()
{
}
public virtual string Id
{
get { return id; }
set { id = value; }
}
public virtual string Name
{
get { return name; }
set { name = value; }
}
public virtual char Sex
{
get { return sex; }
set { sex = value; }
}
public virtual float Weight
{
get { return weight; }
set { weight = value; }
}
}
}
Hay un recurso embebido que describe el mapeo Cat.hbm.xml:
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
namespace="NHibernateExample1.Domain" assembly="NHibernateExample1.Domain">
<class name="Cat" table="Cats">
<!-- A 32 hex character is our surrogate key. It's automatically
generated by NHibernate with the UUID pattern. -->
<id name="Id">
<column name="CatId" sql-type="char(32)" not-null="true"/>
<generator class="uuid.hex" />
</id>
<!-- A cat has to have a name, but it shouldn' be too long. -->
<property name="Name">
<column name="Name" length="16" not-null="true" />
</property>
<property name="Sex" />
<property name="Weight" />
</class>
</hibernate-mapping>
Hay un ExecuteAll.cmd en el directorio Sql, que crea la base de datos a usar (pueden darle como parámetro el servidor de MS SQL Server a usar, .\SQLEXPRESS es el valor asumido):

La aplicación de consola es simple: configura NHibernate, obtiene una sesión, inserta nuevos objetos en una transacción, ejecuta una consulta, y lista el resultado:
static void Main(string[] args)
{
ISessionFactory sessionFactory = new Configuration().Configure().BuildSessionFactory();
ISession session = sessionFactory.OpenSession();
ITransaction tx = session.BeginTransaction();
Cat cat;
cat = new Cat() { Name = "Moe", Sex = 'M', Weight = 9.0f };
session.Save(cat);
cat = new Cat() { Name = "Larry", Sex = 'M', Weight = 8.5f };
session.Save(cat);
cat = new Cat() { Name = "Sue", Sex = 'F', Weight = 7.5f };
session.Save(cat);
tx.Commit();
IQuery query = session.CreateQuery("select c from Cat as c where c.Sex = :sex");
query.SetCharacter("sex", 'M');
foreach (Cat kitty in query.Enumerable())
System.Console.Out.WriteLine("Male Cat: " + kitty.Name);
session.Close();
System.Console.ReadLine();
}
Ejecutando la aplicación de consola se inserta en la base estos datos:
El ejemplo es simple. Ahora que está funcionando con NHibernate 2.0, pienso actualizar mis templates de AjGenesis para usar esa versión.
No dejen de visitar el sitio de comunidad de NHibernate, para conseguir más información:
http://nhforge.org
Si tienen dudas sobre NHibernate, pueden preguntar en el grupo en español:
NHibernate-Hispano
Nos leemos!
Angel “Java” Lopez
http://www.ajlopez.com
http://twitter.com/ajlopez