FluentMapping ComposedId with AutoInc

时间:2012-05-29 15:09:39

标签: c# nhibernate fluent-nhibernate auto-increment composite-id

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

2 个答案:

答案 0 :(得分:0)

来自documentation

  

您无法使用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映射到旧的遗留数据库,只需编写数据映射代码。根据我的经验,它可能更快,更容易,更少痛苦。