mercredi 3 février 2010

TP Active Record - Articles/Catégorie [NHibernate] (Partie 3)

Nous voici dans la 3nd section TP Active Record, ceci est l'explication pas à pas d'un TP de création de site Web permettant de créer des articles et d'en associer des catégories.
A ce niveau la nous utiliserons le pattern  " ActiveRecord " de l'API Castle Project utilisant NHibernate. ActiveRecord est un design pattern qui permet de masquer la complexité des interactions avec la base de données en évitant d'écrire du code SQL
Le gros avantage avec ce pattern c'est qu'il permet d'écrire aussi dans une seule et même classe le mapping base de données et la classe/l'objet métier. Je vous invite à lire l'article montrant les différences de fonctionnement entre " ActiveRecord " et un accès classique NHibernate (Mapping_NHibernate_2010-01 ...).
Ajout des références

Pour faire fonctionner " Castle " ainsi que NHibernate il est nécessaire d'ajouter à votre projet DomainModel un certain nombre de DLL.
  • Castle.ActiveRecord.dll
  • Castle.ActiveRecord.Linq.dll

Depuis votre dossier Models, rajouter une 1ère classe " Article ". En entête de classe rajouter les namespaces (using) d'ActiveRecord.
using Castle.ActiveRecord;
using Castle.ActiveRecord.Linq;

De ce fait, l’IntelliSense de VS, vous guide dans l’utilisation d’ActiveRecord.
Les classes - Article/Catégorie
    Modèle

Rappelons le principe de base de notre TP : 
  • Un article contient 0..* catégorie (tag).
  • Une catégorie (tag) est contenu par 1..* article

    Article
Dans cette partie nous allons décrire la classe Article. Un article contient donc :

Se traduisant par la classe objet C# :
public class Article
{
    public int Id { get; set; }
    public string Titre { get; set; }
    public string Descriptif { get; set; }
    public DateTime DateCreation { get; set; }
    public DateTime DateModification { get; set; }
    public string Auteur { get; set; }
}

    Catégorie
Dans cette partie nous allons décrire la classe Catégorie. Une catégorie contient donc :
Se traduisant par la classe objet C# :
public class Categorie
{
    public int Id { get; set; }
    public string Nom { get; set; }        
}

    Article_Categorie
Dans cette partie nous allons décrire la classe Article_Categorie. C'est l'association entre un article et une ou plusieurs catégories.

Cette table en base de données n'a pas de représentation en classe. Elle se traduira " uniquement " par des attributs spécifiques dans les classes article et catégorie. Car depuis un article il est évident de récupérer la liste des catégories qui lui sont associées.

Mapping

Pour que NHibernate puisse reconnaitre les champs et les tables il est obligatoire de renseigner un mapping. Ce dernier peux se faire de deux manières, soit en créant un fichier XML de mapping indiquant quelles tables correspondent à quelles classes, soit en " marquant " les fonctions et les attributs dans la classe directement.
C'est cette dernière méthode que nous allons retenir et utiliser grâce à " ActiveRecord ".
Il faut donc transformer nos classes comme ceci :
[ActiveRecord(Table="EBN_ARTICLES")]    // Précise la table
public class Article : ActiveRecordBase< article >
{
   [PrimaryKey(SequenceName="SEQ_EBN_ARTICLES")]
   // Précise la séquence Oracle pour la primary key
   public int Id { get; set; }
   
   [Property(Column="Titre")]   
   // Précise le champs en BDD (inutile si identique)
   public string Titre { get; set; }
   [Property]
   public string Descriptif { get; set; }
   [Property]
   public DateTime DateCreation { get; set; }
   [Property]
   public DateTime DateModification { get; set; }
   [Property]
   public string Auteur { get; set; }

   // DOC : http://www.castleproject.org/activerecord/documentation/v1rc1/manual/attributedocs/Generated_HasAndBelongsToManyAttribute.html
   // Map une relation plusieurs a plusieurs 
   [HasAndBelongsToMany( typeof(Categorie), RelationType.Bag, 
       Table="Article_Categorie", ColumnKey="Article_ID", ColumnRef="Categorie_ID" )]
   public IList< categorie > Categories { get ; set ; }
}

Documentation complémentaire sur le [HasAndBelongsToMany]
[ActiveRecord(Table="EBN_CATEGORIES")]
public class Categorie : ActiveRecordBase< categorie >
{
    [PrimaryKey(SequenceName = "SEQ_EBN_CATEGORIES")]
    public int Id { get; set; }
    
    [Property]
    public string Nom { get; set; }        
}

Il est important de remarquer l'héritage de la classe d'ActiveRecord (ActiveRecordBase
) permettant d'accéder aux fonctions de base pour l'accès a la base de données, telle que base.Update(),base.Save(),base.Delete() …
C'est grâce à cet héritage que vous pourrez " manipuler " votre base de données. 

Aucun commentaire:

Enregistrer un commentaire