2009-02-16 10 views
4

Disons que nous avons une entité Employé composée de quelques autres entités, telles que des adresses et des contacts un-à-plusieurs, et quelques champs (nom, âge, etc). Nous avons mappé cette entité et pouvons l'utiliser très bien, en enregistrant chaque élément dans les tables "Employee", "EmployeeAddresses" et "EmployeeContacts". Cependant, nous utilisons à peu près toutes les informations de cet employé pour un gros calcul et avons un objet séparé "EmployeeInput" composé des mêmes listes d'objets Address et Contact (ie l'objet Employee et EmployeeInputs a une liste d'adresses et Entités de contact). Nous devons sauvegarder cette information lorsque nous effectuons le calcul à des fins d'audit ultérieur. Nous souhaitons enregistrer cette entité EmployeeInput dans une table "EmployeeInput" dans la base de données.NHibernate - mappe la même entité à différentes tables dans la même base de données

Le problème que nous rencontrons est de savoir comment sauvegarder les listes d'adresses et de contacts. Nous aimerions les coller dans quelque chose comme "EmployeeInputAddresses" et "EmployeeInputContacts", mais les adresses d'adresse et de contact sont déjà mappées à "EmployeeAddresses" et "EmployeeContacts", respectivement. Quelle est la manière la plus simple d'y parvenir sans créer une nouvelle entité "EmployeeInputAddress" et "EmployeeInputContact" et séparer les fichiers de mapping pour chacun d'entre eux (car les champs seraient littéralement dupliqués un par un). Autrement dit, comment pouvons-nous associer une seule entité, Address, à deux tables différentes en fonction de l'objet parent auquel elle appartient (table EmployeeAddresses si elle enregistre à partir d'un objet Employee et table EmployeeInputAddresses si elle enregistre à partir d'un objet EmployeeInput).

Répondre

5

Le moyen le plus simple serait d'avoir des adresses et des contacts mappés en tant qu'éléments composites. De cette façon, vous pouvez mapper votre collection différemment pour Employee et pour EmployeeInput puisque le mappage appartient au conteneur.

Par exemple:

public class Employee 
{ 
    public List<Address> Addresses{get; set;} 
} 


public class EmployeeInput 
{ 
    public List<Address> Addresses{get; set;} 
} 

public class Address 
{ 
    public string Street{get;set;} 
    public string City{get; set;} 
} 

aurait la mise en correspondance folloying:

<class name="Employee" table="Employees"> 
    <id name="id"> 
     <generator class="native"/? 
    </id> 
    <list name="Addresses" table="EmployesAddresses"> 
     <key column="Id" /> 
     <index column="Item_Index" /> 
     <composite-element class="Address"> 
      <property name="Street" /> 
      <property name="City" /> 
     </composite-element> 
    </list> 
</class> 

<class name="EmployeeInput" table="EmployeesInput"> 
    <id name="id"> 
     <generator class="native"/? 
    </id> 
    <list name="Addresses" table="EmployeesInputAddresses"> 
     <key column="Id" /> 
     <index column="Item_Index" /> 
     <composite-element class="Address"> 
      <property name="Street" /> 
      <property name="City" /> 
     </composite-element> 
    </list> 
</class> 
Questions connexes