NHibernate mapping by code
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!