Gestion d’une relation un-à-plusieurs avec des types de valeur dans Fluent NHibernate

Je travaille sur la migration d’une application vers NHibernate et j’utilise Fluent NHibernate. Je rencontre un problème qui mappe une collection de types de valeur sur une racine agrégée.

J’ai un type de valeur PhoneNumber qui a quelques propriétés – Number , NumberType et Description . Un certain nombre d’objects de mon domaine possèdent des collections de numéros de téléphone.

Dans la firebase database (SQL 2008), ces valeurs sont conservées dans des tables différentes. Je pourrais donc avoir des Customers et des VendorPhoneNumbers CustomerPhoneNumbers ainsi que des Vendors et des VendorPhoneNumbers . Les tables de numéros de téléphone sont identiques, à l’exception de la clé étrangère qui les relie à leur parent.

Le problème est que je voudrais utiliser un type de valeur PhoneNumber simple sans avoir à créer les types CustomerPhoneNumber et VendorPhoneNumber qui ont des propriétés qui les VendorPhoneNumber à leur type parent, et je ne sais pas comment le réaliser dans NHibernate. Est-ce possible ou dois-je modifier les objects de domaine pour qu’ils correspondent plus étroitement au schéma de firebase database sous-jacent?

UPDATE: Un peu plus d’infos
Il semble que j’ai du mal à obtenir la carte de base pour qu’elle soit récupérée. Voici un exemple simplifié de ce que j’ai:

 public class CustomerMap : ClassMap { public CustomerMap() { Table("Customers"); Id(x => x.Id); Map(x => x.Name); Component(x => x.Address); HasMany(x => x.PhoneNumbers) .KeyColumn("CustomerId") .Cascade.All() .Table("CustomerPhoneNumbers"); } } public class PhoneNumberMap : ClassMap { public PhoneNumberMap() { Id(x => x.Id); Map(x => x.Number, "PhoneNumber"); Map(x => x.PhoneNumberType); Map(x => x.Description); } } 

Il semble que le code SQL ne soit pas généré correctement. Lorsque j’essaie de consulter la liste des numéros de téléphone d’un client, une erreur ADO m’indique que NHibernate recherche une table appelée PhoneNumber .

Il semble que cela ne capte pas la partie Table("CustomerPhoneNumbers") et utilise par défaut une table nommée de la même manière que l’object. Pourtant, je ne peux pas spécifier de table dans PhoneNumberMap, car ce sera différent en fonction de la racine agrégée pour laquelle nous extrayons.

Vous pouvez mapper l’object unique PhoneNumber à plusieurs tables à l’aide de l’atsortingbut de mappage nom-entité. Désolé, aucun exemple de code – je n’utilise pas Fluent, je ne peux donc pas vous aider avec cet aspect. Je pourrais poster des exemples de mappages HBM si cela peut être utile.

Le nom d’entité remplace fondamentalement le nom de la classe. Lorsque vous utilisez nom-entité, vous devrez également modifier votre session pour accepter un paramètre permettant de spécifier le nom de l’entité chaque fois que vous travaillerez avec les objects via la session.

La documentation est ici:

http://docs.jboss.org/hibernate/core/3.2/reference/en/html/mapping.html#mapping-entityname

EDIT Ajouté des échantillons hbm.

Ceci mappe un seul object PhoneNumber à plusieurs tables.

               

Ensuite, pour appeler par exemple une mise à jour sur un numéro de téléphone, vous modifiez la syntaxe de session comme suit afin que nhibernate sache quelle table utiliser:

 _session.Update("PhoneNumberCustomer", myCustomerNumber) 

Vous devrez déterminer si Fluent supporte même cela, si oui, comment le faire. Sinon, vous pouvez toujours utiliser des fichiers hbm pour l’object PhoneNumber.