NHibernate mapping by code

Az NHibernate egyik gyerekbetegsége volt az, hogy a mapping -et, azaz az osztályok és az adatbázis tábláinak és mezőinek az összerendelését XML fájlokon kereszztül lehetett beállítani.
Mit is jelent ez?
Íme egy példa rá:

<?xml version='1.0' encoding='utf-8' ?>
<hibernate-mapping xmlns='urn:nhibernate-mapping-2.2' assembly="Example" namespace='Example'>
<class name='User' table='user' dynamic-update='true' dynamic-insert='true' >
 <id name='Id' column="Id" >
  <generator class='hilo'>
   <param name='table'>globalid</param>
   <param name='column'>Id</param>
   <param name='max_lo'>0</param>
  </generator>
 </id>
 <property name='Password' column="Password" />
 <property name='Name' column="Name" />
 <property name='Mothername' column="Mothername" />
 <property name='Bornname' column="Bornname" />
 <property name='Borndate' column="Borndate" />
 <property name='Taj' column="Taj" />
 <property name='Vatnumber' column="Vatnumber" />
 <property name='Addresscardno' column="Addresscardno" />
 <property name='Archived' column="Archived" />
 <property name='Username' column="Username" />
 <property name='Serial' column="Serial" />
 <property name='External' column="External" />
</class>
</hibernate-mapping>


Van egy táblánk, amelyben a felhasználó adatait tároljuk el. Ne foglalkozzunk most azzal, hogy a felhasználói táblának millió kapcsolódása van, mi csak arra vagyunk kiváncsiak, hogy milyen úton – módon lehet rábeszélni az NHibernate -et arra, hogy az osztály és a tábla között megtalálja a kapcsolatot.

Ez eléggé nehéz és áttekinthetetlen hogyha 15 mezőnél többet tartalmaz a tábla.

Az új NHibernate 3.2 egyik újítása (rögtön jegyezzük meg itt, hogy a Fluent NHibernate már ezt jóideje tudja), hogy a feltérképezést kódbol is el lehet végezni.
Mi kell hozzá?

Az NHibernate.Mapping.ByCode osztály, és egy kis ráérző képesség, semmi több!

Íme az előző példa, C# kódként!

public virtual ModelMapper Mapping()
{
var mapper = new ModelMapper();
mapper.Class<User>(
ca =>
 {
  ca.EntityName(this.GetType().ToString());
  ca.Table("user");
  ca.DynamicUpdate(true);
  ca.DynamicInsert(true);
  ca.Id(x => x.Id, map =>
  {
   map.Column("Id");
   map.Generator(Generators.HighLow, gmap => gmap.Params(new { max_low = 0 }));
   });
   ca.Property(x => x.Password, map => map.Column("Password"));
   ca.Property(x => x.Name, map => map.Column("Name"));
   ca.Property(x => x.Mothername, map => map.Column("Mothername"));
   ca.Property(x => x.Bornname, map => map.Column("Bornname"));
   ca.Property(x => x.Borndate, map => map.Column("Borndate"));
   ca.Property(x => x.Taj, map => map.Column("Taj"));
   ca.Property(x => x.Vatnumber, map => map.Column("Vatnumber"));
   ca.Property(x => x.Addresscardno, map => map.Column("Addresscardno"));
   ca.Property(x => x.Username, map => map.Column("Username"));
   mapper.AddMappings(typeof(User).Assembly.GetTypes());
   return mapper;
}

Mennyivel átláthatóbb, nyomon követhetőbb, és nem utolsó sorban kisebb az esély az elírásra, mint az XML esetén, amit futásidőben dolgoz fel az NHibernate -t!

Related Posts