domingo, 24 de abril de 2011

ConfORMando NHibernate

Voy a intentar hacer una serie de post explicando como mapear nuestros objetos de dominio a NHibernate utilizando ConfORM.

Lo primero que necesitamos es un dominio. Para este caso vamos a usar un dominio sencillo:

	
public class Company
{
virtual public int CompanyId { get; set; }
virtual public string Name { get; set; }
virtual public string Address { get; set; }
virtual public string PostalCode { get; set; }
virtual public string State { get; set; }
virtual public string Country { get; set; }
virtual public string Phone { get; set; }
virtual public IList Employees { get; set; }
}
public class Employee
{
virtual public int EmployeeID { get; set; }
virtual public string Name { get; set; }
virtual public Company Company { get; set; }
virtual public string Address { get; set; }
virtual public string PostalCode { get; set; }
virtual public string State { get; set; }
virtual public string Country { get; set; }
virtual public string Phone { get; set; }
}

Nada que comentar en el dominio. Tenemos una clase empresa que tiene empleados.

Ahora vamos a preparar nuestro ORM, en este caso NHibernate. Voy a utilizar NHibernate 3 y su nueva api de configuración


	    
Configuration nhConfig = new Configuration();
nhConfig.SessionFactoryName("ConfORMando");
nhConfig.Proxy(p =>
{
p.Validation = false;
p.ProxyFactoryFactory();
}
);
nhConfig.DataBaseIntegration (db =>
{
db.Dialect();
db.Driver();
db.KeywordsAutoImport = Hbm2DDLKeyWords.AutoQuote;
db.IsolationLevel = IsolationLevel.ReadCommitted;
db.ConnectionString = connectionString;
db.Timeout = 10;
db.HqlToSqlSubstitutions = "true 1, false 0, yes 'Y', no 'N'";
}
);

Ahora llega el turno de ConfORM. Con este API vamos a usar dos objetos:


  • ObjectRelationalMapper: que se utiliza para indicar las reglas generales del mapeo y se le indican las clases que forman parte del dominio

  • Mapper: El encargado de generar los metadatos para el ORM concreto, en nuestro caso NHibernate. En este objeto indicaremos (si fuese necesario) las expceiones y correciones manuales de los mapeos.


Para no complicar las cosas en el primer ejemplo (a ver si soy constante y hago más) vamos a dejar las opciones por defecto, salvo el generador de IDs que por defecto utiliza HiLo y por ahora quiero utilizar native.


            
var orm = new ObjectRelationalMapper();
orm.Patterns.PoidStrategies.Add(new NativePoidPattern());
var mapper = new Mapper (orm);

IEnumerable DomainEntities = typeof(Company).Assembly.GetTypes();
//En este ejemplo utilizaremos para las dos clases Table per Class
orm.TablePerClass(DomainEntities);
//Le indicamos al Mapper que nos genere el maepo para las clases del dominio
var mapping = mapper.CompileMappingFor(DomainEntities);

System.IO.File.WriteAllText (hbmFile, mapping.AsString());


//añadimos las clases mapeadas a la configuaracion de Nhibernate que creamos antes
nhConfig.AddDeserializedMapping(mapping, "ConfORMDomain");


¡¡Ya está ya tenemos nuestras clases mapeadas con NHibernate!! ¿No me creéis? bueno, afortunadamente el Mapper de NHibernate de ConfORM tiene un método llamado AsString con el que se puede generar el fichero hbm. Así que os puedo mostrar el resultado:


<?xml version="1.0" encoding="utf-8"?>
<?XML:NAMESPACE PREFIX = [default] urn:nhibernate-mapping-2.2 NS = "urn:nhibernate-mapping-2.2" />





























Y si genero la base de datos utilizando el SchemaExport de NHibernate puedo generar la base de datos (o el script de generación) con este resultado:



CompanyEmployeeDBModel



Esto es solo la punta del iceberg, ConfORM tiene muchísimo más que ofrecer.

1 comentario:

  1. Parece fácil, :) ¿es necesaria alguna convención de nombres (identificadores, entidades relacionadas)?

    ResponderEliminar