lunes, 25 de abril de 2011

ConfORMando Nhibernate 2, Components

Vamos a continuar partiendo del ejemplo de ayer. Teníamos un dominio muy sencillo con  Company y Employee. Si nos fijamos las dos clases tienen la misma estructura para la información de contacto, así que vamos a crear una nueva clase para almacenar estos datos. El dominio queda así:

    public class Company
{
virtual public int CompanyId { get; set; }
virtual public string Name { get; set; }
virtual public ContactInfo ContactInfo { 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 ContactInfo ContactInfo { get; set; }
}
public class ContactInfo
{
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; }
}


No nos interesa que ContactInfo tenga una tabla donde se almacene en base de datos, queremos que la información de contacto se siga almacenando en las tablas de empleado y empresa.

Veamos como queda nuestro código con ConfORM y el mapping que genera



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

IEnumerable DomainEntities = typeof(Company).Assembly.GetTypes();
//A ContactInfo no queremos aplicarle una política de Persistencia por clase, asi que no la incluimos.
orm.TablePerClass(DomainEntities.Where (e=> e != typeof (ContactInfo)));
//Le indicamos al Mapper que nos genere el maepo para las TODAS clases del dominio, incluida ContactInfo
var mapping = mapper.CompileMappingFor(DomainEntities);


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

































Con component Nhibernate nos permite mapear propiedades de una clase a la tabla de la clase que contiene la tabla. En nuestro caso, las propiedades de ContactInfo se almacenaran en las tablas donde se almacenen las clases que la usen.



En resumen, hemos añadido una clase, pero nuestro modelo de datos no se ha modificado.

1 comentario: