我继承的遗留数据库包含以下表格:
Teams (
TeamId INT PRIMARY KEY,
Name VARCHAR(30)
)
Players (
PlayerId INT PRIMARY KEY,
Team VARCHAR(30)
)
player表中的外键是指团队名称,而不是teamId。
我尝试使用行李从团队映射到玩家:
<bag name="Players">
<key column="Team" foreign-key="Name" />
<one-to-many class="DataTransfer.Player, DataTransfer" />
</bag>
但是我得到了SqlException: 将varchar值'Arsenal'转换为数据类型int
时转换失败我已经能够使用包来映射其他区域中的字符串外键,但在这些情况下,外键引用父表的主键。
编辑:我正在使用NHibernate 2.0.1
答案 0 :(得分:3)
现在我不是百分百确定这是否可行,但你尝试过多对一的映射关系吗?
也许是这样的:
<many-to-one name="Players" class="DataTransfer.Player, DataTransfer"
column="Name" property-ref="Team" />
我认为应该可行,根据NHibernate手册,property-ref是一个用于映射遗留数据的属性,其中外键引用除主键之外的关联表的唯一键。这听起来像你发现自己的情况。
答案 1 :(得分:3)
我认为property-ref属性的存在是为了解决这个问题。
<bag name="Players">
<key column="Team" property-ref="Team" />
<one-to-many class="Player" property-ref="Team" />
</bag>
答案 2 :(得分:0)
我认为您需要使用property-ref属性来定义要关联的字段。 foreign-key属性用于生成DDL以创建关系(如果使用该功能)。
答案 3 :(得分:0)
刚刚发现:https://nhibernate.jira.com/browse/NH-1272,似乎这是NHibernate中的一个错误,它在2.1.0Alpha1中修复。
我在NHibernate 2.1.0Alpha2中试过它,它有效!
(property-ref应该只在map标签中)