The legacy database I've inherited contains the following tables:
Teams (
TeamId INT PRIMARY KEY,
Name VARCHAR(30)
)
Players (
PlayerId INT PRIMARY KEY,
Team VARCHAR(30)
)
The foreign key in the players table refers to the team name, rather than teamId.
I've attempted to map from Team to Players using a bag:
<bag name="Players">
<key column="Team" foreign-key="Name" />
<one-to-many class="DataTransfer.Player, DataTransfer" />
</bag>
But I get SqlException:
Conversion failed when converting the varchar value 'Arsenal' to data type int
I've been able to use a bag to map string foreign keys in other areas, but in those cases the foreign key referred to the primary key of the parent table.
Edit: I'm using NHibernate 2.0.1
I think the property-ref attribute exists to solve this problem.
<bag name="Players">
<key column="Team" property-ref="Team" />
<one-to-many class="Player" property-ref="Team" />
</bag>
Now I'm not 100% sure if this will work but have you tried a many-to-one mapping relationship?
Maybe something like this:
<many-to-one name="Players" class="DataTransfer.Player, DataTransfer"
column="Name" property-ref="Team" />
I believe that should work, according to the NHibernate manual property-ref is an attribute that is useed for mapping legacy data where a foreign key refers to a unique key of the associated table other than the primary key. This sounds like the situation you find yourself in.
I believe that you would need to use the property-ref attribute to define the field that you will be associating to. The foreign-key attribute is used to generate DDL to create the relationships (if you use that feature).
Just found this: https://nhibernate.jira.com/browse/NH-1272, seems this is a bug in NHibernate, and it is fixed in 2.1.0Alpha1.
I have tried it in NHibernate 2.1.0Alpha2, and it works!
(property-ref should only be in the map tag)