2010-10-01 19 views
3

J'ai un problème avec NHibernate et le type de données postgresql POINT (bien que je pense que c'est un problème courant pour tous ceux essayer de mapper un TYPE SQL qui n'est pas couvert par NHibernate SqlTypes).Implémentation d'un nouveau type NHibernate pour le type de données POINT postgresql (ou toute COLONNE d'un type nhibernate analogue non primitif)

Ma classe Data.Point a deux flottants publics: xcoordinate et ycoordinate.

Ma première tentative a essayé de mettre en œuvre l'interface IUserType, mais je me suis vite découvert que le problème vient plus tôt, pendant la phase de cartographie:

MappingException était non gérée par le code utilisateur:
Impossible de déterminer le type pour: Data.PointUserType, Data.Point, pour les colonnes: NHibernate.Mapping.Column (coordonnées)

Je suis très nouveau pour NHibernate, mais il me semble que je ne peux créer un nouveau type si la colonne dans la base de données est d'un type connu (un de float, int, var char et tous les types "classiques", mais pas les types géométriques dont j'ai besoin).

J'avais réussi à mapper mon POINT à deux propriétés différentes, en mappant les coordonnées [0] et les coordonnées [1]. Mais ceci n'est utile que pour les requêtes SELECT et UPDATE, car pour INSERT, postgresql se plaindra que "coordonnées" n'est pas Nullable.

De plus, je ne trouve pas une version actuelle des extensions NHibernate Spatial, et je préfère de loin avoir le contrôle de mon type POINT, car je n'utiliserai que très rarement ce type, et donc je préférerais ne pas charger l'ensemble des assemblées NHibernate Spatial (à supposer qu'elles soient développées activement, sinon je m'en tiendrai à ne pas les suivre).

Mes dernières pensées sont que je dois jouer avec la génération SQL NHibernate (depuis une partie de l'insertion SQL serait « (a, b) » :: point de, quelque chose de très spécifique), et peut-être c'est un peu trop gênant (peut-être pas, je serais prêt à y jeter un coup d'œil). Je suis assez nouveau à NHibernate, mais je suis désespérée. Quelqu'un peut-il me pointer quelque part?

+0

Je sais qu'il est un peu en retard, mais étaient vous êtes capable de le faire? J'essaie de cartographier le type de point postgresql à Nhibernate, avec ou sans NH.Spatial, et je continue de trouver vos questions. –

+1

En effet, j'ai, mais il y a des choses à noter. Contactez-moi à mzabani at gmail dot com. –

Répondre

1

Je suis arrivé récemment NHibernate travaille avec SQL Server 2008. Pour voir comment voir cette question: NHibernate.Spatial and Sql 2008 Geography type - How to configure

Il serait plus facile d'aider si vous vous avez inclus fichier de mappage. Je me demande si vous avez correctement enregistré votre IUserType? Il devrait ressembler à ceci

<class name="WhereAmI"> 
    <property name="Point"> 
     <type name="MyProject.MyPointUserType, MyProject"> 
     </type> 
    </property> 
</class> 

Voir également jeter un oeil à la mise en œuvre de IUserType suivante qui fonctionne pour MS SQL 2008 Servier: NHibernate.Spatial.Type.GeometryType

+0

Merci pour la réponse, très récemment une version NHibernate Spatial est sortie (après un long moment). Il semble alors que Spatial est en cours de développement (avec des versions pas très fréquentes, cependant). Cependant, je préférerais implémenter mon propre type de données POINT que d'inclure beaucoup de bibliothèques juste pour gérer ce type que j'utiliserai très rarement .. aucune idée à ce sujet? –

+0

Je ne suis pas vraiment qualifié pour commenter le vôtre, comme je ne l'ai jamais fait. Cependant j'ai jeté un coup d'oeil sur le nHibernate.Le code spatial et il semble non-trivial. L'avantage de rouler le vôtre vaut-il donc la peine? Je ne soupçonne pas – Iain

+0

Ceci est un très bon point et j'avais peur que ce soit le cas (mettre en œuvre ce que je veux est non-trivial). Dans ce cas, je dois choisir entre faire des insertions avec du SQL brut, alors que SELECT et UPDATE sont faites avec NHibernate en mappant les coordonnées [0] et les coordonnées [1], ou en utilisant Spatial. Qu'est-ce que tu penses? –