12
votes

Pleant Nibernate Automapping de la liste ?

Nibernate fluide n'aime pas cela, jetant une erreur:

{"Références d'association Mapappé Classe: System.string"}

OK bien, je peux voir pourquoi cela causerait un problème - mais quelle est la meilleure solution?

Je ne veux pas vraiment qu'il stocke une liste délimitée de chaînes dans un seul champ, cela deviendrait laid si ma liste contient de nombreuses chaînes.

Je ne veux pas vraiment vraiment une table 'String', pour des raisons évidentes.

Je suppose que je peux résoudre ceci en enveloppant ma liste dans une classe, mais cela ressent un peu de poids lourd. Je commence à penser à sa meilleure solution cependant.

Quel est le meilleur moyen d'obtenir couramment NHibernate de gérer cela?

J'attends totalement que ces valeurs soient stockées dans une autre table. Je pensais peut-être que j'ai peut-être pu être en mesure de configurer une convention d'AutoSappopper qui indique à NHibernate 'si vous voyez un class x contenant liste <* Quelque type primitif *> , puis Allez-y et créez automatiquement une table de référence qui correspond à cette collection.

Il se sent un peu lourd pour aller et envelopper chaque collection d'une classe. Si c'est la meilleure solution cependant, alors alors soyez-le.


4 commentaires

Si vous ne le voulez pas comme une chaîne délimitée dans un seul champ et que vous ne le voulez pas dans une autre table, alors ? C'est toujours une base de données relationnelle ...


Je ne suis pas dérangé par la manière dont la base de données relationnelle gère cela. Je me demande comment je peux obtenir l'automne pour déduire C'est ce que je veux faire pour toutes les listes de chaînes dans mon modèle de domaine.


@ALEX - Autant que je sache, il n'y a aucun moyen de dire fluide NHibernate comment cartographier toutes les listes de chaînes. La solution que je fournis dans ma réponse nécessite une substitution pour chaque liste des chaînes de votre modèle de domaine. Ce n'est que quelques lignes de code pour chaque dérogation, ce n'est donc pas trop mauvais ...


Je rencontre cela aujourd'hui et j'ai trouvé une solution plus simple (région avec une liste de codes de pays): Hasmany (x => x.countries) .keycolumn ("cntry_region_cd"). Élément ("valeur");


3 Réponses :


1
votes

Pensez-y de cette façon ... Comment allez-vous le faire sans hibernation? Eh bien, vous auriez probablement une table avec une colonne de clé étrangère et de chaîne? Maintenant, comment faites-vous cela avec hibernate? Vous configurez une autre classe avec une propriété de plusieurs-un et de cordes. Ensuite, vous mappez une collection de cette classe.


2 commentaires

Ok, point prisé. Je n'aime tout simplement pas avoir à créer toutes ces classes totalement triviales pour envelopper des collections primitives. Puis-je avoir la montagne en déduire cela pour moi?


Oh, alors vous n'avez pas besoin de créer une autre classe? Je pense que c'est possible ... nhforge.org/doc/nh/fr /Index.html#Collections-ofva Lues Voir comment ils ont donné l'exemple d'un ensemble d'INTS, on dirait que vous faites une collection régulière puis définissez une propriété d'élément pour votre chaîne.



7
votes

J'avais exactement le même problème de quelques semaines, avec des flotteurs au lieu de cordes.

comment faire-vous-u-upochfloat-ou-float-with-fluent-nhibernate

Il s'avère que l'automppe ne fonctionne pas avec Types primitifs.

EDIT - Ce n'est plus vrai - l'équipe FNH a corrigé le problème

Il y a beaucoup de code d'échantillon dans la réponse acceptée à la réponse acceptée. ma question, mais le point clé est d'ajouter une substitution pour vos listes de types primitifs ("RAWY" dans l'exemple ci-dessous): xxx

Je m'attendrais à la même approche de travailler avec des ilistes de chaînes.


2 commentaires

Ok ça a l'air intéressant. Est-ce quelque chose qui peut être défini via des conventions? Il semble que FNH se concentre sur les conventions de personnaliser l'automne.


Je ne le pense pas. J'ai eu la solution en posant la question sur la liste de diffusion courante et croire que c'était l'un des auteurs de la FNH qui me l'a donné. Si cela pouvait être fait par une seule convention, je pense qu'il aurait suggéré que.



4
votes

Puisque j'ai posté ma première réponse, l'équipe Nibernate fluide a résolu ce problème.

Vous pouvez maintenant automatiser des ILIST de types de valeur C # (chaînes, intens, flotteurs, etc.).

Assurez-vous d'avoir une version récente de FNH.


2 commentaires

Hélas, c'est presque un an de retard pour mes besoins - peu importe son bien de voir FNH la mise en œuvre, c'était le seul véritable obstacle que j'ai rencontré lors de l'utilisation d'une grande application LOB.


Kudos Tom pour revenir un an plus tard pour fournir cette mise à jour.