我正在为公司应用程序创建一个传输数据工具,将数据从旧版本移动到新版本,然后返回。从现在开始我们使用NHibernate和FluentMapping,我将必须映射所有旧表,并且一个表具有组合主键存在问题。该表如下所示:
public class OldTable {
public string KeyOne {get;set}
public string KeyTwo {get;set}
public string KeyN {get;set}
public int Sequence {get;set}
...
}
我需要将所有上述字段映射为复合键,唯一的问题是“序列”基于其他字段递增以避免重复键,其他字段是外键和简单字符串的混合。有没有办法做这个映射?如果需要创建一个表达式来计算序列,没问题。
好消息是新系统中的表只使用整数Id。
答案 0 :(得分:0)
您无法使用
IIdentifierGenerator
生成复合键。相反,应用程序必须分配自己的标识符。
您也可以在HBM XML架构中看到这一点。 <id>
允许指定<generator>
,但<composite-id>
不允许。
并不是说这个功能无法添加到NHibernate中。如果这对您有用,请将您的功能请求提交至the NHibernate issue tracker。如果首先在Hibernate中实现此功能,则您的功能请求最有可能成功 - 如果是这样,将其移植可能很简单。听起来它可能已经在Hibernate中实现了: HHH-2060
答案 1 :(得分:-2)
是的,尝试为遗留数据库创建NHibernate映射是一件非常痛苦的事。复合键是一个特别有趣的领域。
当您说您需要将所有字段映射为主键时,我会假设您指的是复合键,因为表中最多只能有一个主键。在这种情况下,您的映射类中的以下内容是否会起作用?
CompositeId()
.KeyProperty(x => x.KeyOne).KeyProperty(x => x.KeyTwo)
.KeyProperty(x => x.KeyN).KeyProperty(x => x.Sequence)
如果你只是试图从遗留数据库中读取数据,你可能会有一些运气,但如果是我,在这种情况下,我可能会避免尝试将NHibernate映射到旧的遗留数据库,只需编写数据映射代码。根据我的经验,它可能更快,更容易,更少痛苦。