Nella scorsa lezione abbiamo visto quali sono le classi e le tabelle del database, ora vedremo come scrivere correttamente i file XML per NHibernate che avranno il nome %nomeclasse%.hbm.xml.
Queste le regole generali per scrivere correttamente un file XML di NHibernate:
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.0" >
<class name="%nomeclasse%, %namespace%" table="%tabella sul database%">
<id name="%nome proprietà sulla classe%" column="%nome del campo di chiave primaria%" unsaved-value="%valore di default per record non salvati%" >
<generator class="native" />
</id>
<property name="%nome proprietà sulla classe%" column="%nome del campo su database%" type="%tipo di campo su database%"/>
<!-- RELAZIONE MOLTI A MOLTI -->
<set name="%nome proprietà sulla classe%" table="%tabella di associazione%" cascade="none" lazy="false" inverse="false">
<key column="%colonna di associazione della tabella padre%" />
<many-to-many column="%colonna di associazione della tabella figlia" class="%classe di ritorno%, %namespace%" />
</set>
</class>
</hibernate-mapping>
Quindi i nostri file XML, sapendo che il namespace l'abbiamo nominato DanieleRuggeri diventerà:
User.nbm.xml
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.0" default-access="property">
<class name="DanieleRuggeri.User, DanieleRuggeri" table="utenti">
<id name="ID" column="idutenti" unsaved-value="0" >
<generator class="native" />
</id>
<property name="Username" />
<property name="Pwd" />
<property name="Email" />
<property name="Scadenza" column="dtscadenza" type="Date"/>
<set name="Roles" table="utenti_gruppi" cascade="none" lazy="false" inverse="false" order-by="idgruppi">
<key column="idutenti" />
<many-to-many column="idgruppi" class="DanieleRuggeri.Role, DanieleRuggeri" />
</set>
</class>
</hibernate-mapping>
Role.hbm.xml
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.0">
<class name="DanieleRuggeri.Role, DanieleRuggeri.DLL" table="gruppi">
<id name="ID" column="idgruppi" unsaved-value="0">
<generator class="native" />
</id>
<property name="Description" column="descrizione" />
</class>
</hibernate-mapping>
Le classi invece saranno scritte come segue:
User
using System;
using System.Collections;
using Iesi.Collections;
namespace DanieleRuggeri
{
public class User
{
private int _ID;
private string _Username;
private string _Pwd;
private string _Email;
private DateTime _Scadenza;
private Iesi.Collections.ISet _Roles; //collezione di gruppi
public User()
{
_ID =0;
_Username=null;
_Pwd=null;
_Email=null;
_Scadenza =new DateTime(2000,01,01);
//_Roles = new Hashtable();
}
public int ID
{
get{return _ID;}
set{_ID =value;}
}
public string Username
{
get{return _Username;}
set{_Username =value;}
}
public string Pwd
{
get{return _Pwd;}
set{_Pwd =value;}
}
public string Email
{
get{return _Email;}
set{_Email =value;}
}
public DateTime Scadenza
{
get{return _Scadenza;}
set{_Scadenza =value;}
}
public Iesi.Collections.ISet Roles
{
get{return _Roles;}
set{_Roles=value;}
}
}
}
Role
using System;
using System.Collections ;
namespace DanieleRuggeri
{
///
/// Description of Role.
///
public class Role
{
private int _ID;
private string _Description;
public Role()
{
_ID=0;
_Description =null;
}
public int ID
{
get{return this._ID;}
set{this._ID=value;}
}
public string Description
{
get{return this._Description;}
set{this._Description=value;}
}
}
}