2

我正在为公司应用程序创建一个传输数据工具,将数据从旧版本移动到新版本,然后再返回。由于现在我们使用 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。

4

2 回答 2

0

文档中:

您不能使用 anIIdentifierGenerator来生成复合键。相反,应用程序必须分配自己的标识符。

您也可以在 HBM XML 模式中看到这一点。 <id>允许<generator>指定 a,但<composite-id>不允许。

这并不是说这个功能不能被添加到 NHibernate。如果这对您有用,请将您的功能请求提交给NHibernate 问题跟踪器。如果此功能首先在 Hibernate 中实现,您的功能请求最有可能成功 - 如果是这样,移植它可能很简单。听起来它可能已经在 Hibernate 中实现了: HHH-2060

于 2013-11-01T18:56:47.013 回答
-2

是的,尝试为遗留数据库创建 NHibernate 映射是一件非常痛苦的事情。复合键是一个特别有趣的领域。

当您说需要将所有字段映射为主键时,我假设您的意思是复合键,因为表中最多只能有一个主键。在这种情况下,您的映射类中的以下内容是否不起作用?

CompositeId()
    .KeyProperty(x => x.KeyOne).KeyProperty(x => x.KeyTwo)
    .KeyProperty(x => x.KeyN).KeyProperty(x => x.Sequence)

如果你只是想从遗留数据库中读取数据,你可能会有一些运气,但如果是我,在这种情况下,我可能会避免尝试将 NHibernate 映射到旧的遗留数据库,而只编写数据映射代码用手。以我的经验,它可能会更快、更容易、更少痛苦。

于 2012-05-29T15:46:54.260 回答