2009-01-20 13 views
4

La base de données de l'héritage que j'ai hérité contient les tableaux suivants:NHibernate - Cartographie d'un étranger Key String

Teams ( 
TeamId INT PRIMARY KEY, 
Name VARCHAR(30) 
) 

Players (
PlayerId INT PRIMARY KEY, 
Team VARCHAR(30) 
) 

La clé étrangère dans la table des joueurs fait référence au nom de l'équipe, plutôt que teamid.

J'ai essayé de la carte de l'équipe aux joueurs en utilisant un sac:

<bag name="Players"> 
    <key column="Team" foreign-key="Name" /> 
    <one-to-many class="DataTransfer.Player, DataTransfer" /> 
</bag> 

Mais je reçois SqlException: La conversion a échoué lors de la conversion de la valeur varchar 'Arsenal' au type de données int

I J'ai été capable d'utiliser un sac pour mapper des clés étrangères dans d'autres zones, mais dans ces cas, la clé étrangère se référait à la clé primaire de la table parente.

Edit: J'utilise NHibernate 2.0.1

+0

Salut, Nous sommes le même problème, avez-vous trouvé une solution à cela? – fredrik

+0

Je me suis contenté de créer une nouvelle colonne de type int pour la clé étrangère et de l'utiliser à la place, je n'ai jamais réussi à faire fonctionner une clé étrangère. –

Répondre

3

Maintenant, je ne suis pas 100% sûr si cela fonctionnera, mais vous avez essayé plusieurs à une relation de cartographie?

Peut-être quelque chose comme ceci:

<many-to-one name="Players" class="DataTransfer.Player, DataTransfer" 
      column="Name" property-ref="Team" /> 

Je crois que cela devrait fonctionner, selon le manuel NHibernate property-ref est un attribut qui est useed pour les données existantes de cartographie où une clé étrangère fait référence à une clé unique de la table associée autre que la clé primaire. Cela ressemble à la situation dans laquelle vous vous trouvez.

+0

J'ai essayé mais j'ai eu l'erreur: Plus d'une ligne avec l'identifiant donné a été trouvée: Arsenal, pour la classe: DataTransfer.Player. J'aurais dû mentionner que je cartographie la relation Équipe -> Joueur plutôt que l'inverse - J'ai mis à jour ma question initiale. –

0

Je crois que vous auriez besoin d'utiliser l'attribut property-ref pour définir le champ auquel vous allez être associé. L'attribut de clé étrangère est utilisé pour générer le DDL pour créer les relations (si vous utilisez cette fonctionnalité).

+2

Avec cela, je reçois une erreur légèrement différente: Type d'identificateur discordance; Trouvé: Prévu:

3

Je pense que l'attribut property-ref existe pour résoudre ce problème.

<bag name="Players"> 
    <key column="Team" property-ref="Team" /> 
    <one-to-many class="Player" property-ref="Team" /> 
</bag> 
+0

NHibernate ne prend pas en charge l'attribut property-ref dans la balise one-to-many, et ajouter property-ref à la balise de clé ne signifie pas travailler soit malheureusement. –

+0

Avoir la propriété-ref en "clé" est juste suffisant. Pas besoin de l'avoir dans le many-to-many n'est pas nécessaire. – Illuminati

0

Je viens de trouver ceci: https://nhibernate.jira.com/browse/NH-1272, semble que ce soit un bogue dans NHibernate, et il est fixé à 2.1.0Alpha1. Je l'ai essayé dans NHibernate 2.1.0Alpha2, et cela fonctionne!

(property-ref ne devrait être dans la balise carte)