2009-05-13 9 views
2

Travailler sur un site Web qui a des employés et des entités de la Direction, en utilisant une table de base de données « Employés » qui contient également l'identifiant de branche et nom de la branche. Je ne peux pas changer la base de données du client, donc j'ai besoin de mapper les employés et les branches de la même table.NHibernate et une table dénormalisé

Je suppose que je dois un certain type de clause distincte dans le fichier XML de mappage pour obtenir une liste distincte ou un ensemble de branches de la table des employés?

Est-il possible que je peux cartographier les deux classes sur la même table? (Peut-il être fait avec Fluent NHibernate?)

+0

Quelle est la relation d'affaires des employés et des succursales? Un employé a-t-il une succursale? –

+0

Oui, un employé a une succursale. –

Répondre

1

composants d'utilisation. Je ne sais pas FluentNhibernate, mais en XML, il ressemble à ceci:

<class name="Employee"> 
    ... 

    <component name="MyBranch"> 
    <!-- Branche properties are here: --> 
    <property name="BrancheName"/> 
    <property name="..."/> 
    </component> 
</class> 

class Employee 
{ 
    Branch MyBranch { get; private set; } 
} 

class Branch 
{ 
    string BrancheName { get; private set; } 
} 

Il est en fait assez simple. Vous le faites également pour des raisons de performances, car vous n'avez pas besoin de joindre des tables lorsqu'il y a toujours une branche sur un employé.

Note: Si toutes les colonnes sont nulles, myBranch sera nulle.

2

Stefan est correct, utiliser des composants. En FluentNHibernate, il ressemblera:

class Branch 
{ 
    string Name { get; set; } 
    DateTime DateOpened { get; set; } 
} 

class Employee 
{ 
    int Id { get; set; } 
    string Name { get; set; } 
    Branch Branch { get; set; } 
} 

class EmployeeMap : ClassMap<Employee> 
{ 
    public EmployeeMap() 
    { 
     Id(x => x.Id); 
     Map(x => x.Name); 
     Component<Branch>(x => x.Branch, c => { 
      c.Map(x => x.Name); 
      c.Map(x => x.DateOpened); 
     }); 
    } 
} 

Le Component<Branch> peut être raccourci juste Component depuis le compilateur déterminer le type automatiquement. De plus, ce que je veux faire est de fournir une fonction AsComponent sur une classe pour mon élément, donc je ne dois pas me répéter partout je la carte du composant:

public static class BranchMap 
{ 
    public Action<ComponentPart<Branch>> AsComponent() 
    { 
     return c => 
     { 
      c.Map(x => x.Name); 
      c.Map(x => x.DateOpened); 
     }; 
    } 
} 

Cela rend également facile d'ajouter en préfixe/fonctions de suffixe pour les cas où une entité peut avoir plusieurs instances d'un composant avec un schéma de dénomination différent.

+0

Merci pour cela, avez-vous travaillé dans Fluent NHibernate comme vous l'avez suggéré. –

Questions connexes