如何使用NHibernate创建多列索引或唯一约束

时间:2009-05-07 13:10:58

标签: nhibernate fluent-nhibernate nhibernate-mapping

如何使用NHibernate Mapping或Fluent NHibernate创建多列索引和/或唯一约束。

2 个答案:

答案 0 :(得分:14)

为多个属性

分配索引/唯一约束名称
<property name="A" index="AB" />
<property name="B" index="AB" />

理论上它也适用于在同一个实体上拥有多个索引:

<property name="A" index="AB, ABC" />
<property name="B" index="AB, ABC" />
<property name="C" index="ABC" />

But there is a bug.我还写了一个补丁。如果您对此感兴趣,请为错误投票或添加评论或其他内容。

修改:刚检查the bug发生的事情。它在版本2.1.0中修复,因此它现在应该完美地工作。非常感谢伟大的NHibernate开发团队!

答案 1 :(得分:14)

很老,但是我遇到了同样的问题,我还有一些事情需要补充:

Stefan Steinegger正确回答了 - 唯一的多列索引,但遗漏了唯一多列索引的代码。对于那些你可以使用:

<property name="A" unique-key="AB" />
<property name="B" unique-key="AB" />

所以,基本上相同但具有不同的属性名称。


有趣的是,对于唯一索引,NHibernate会为密钥生成自己的名称,但对于非唯一索引,它会使用您提供的任何内容。

例如,上面的代码不会生成名为“AB”的唯一索引,而是UQ__TableName__7944C87104A02EF4

这在NHibernate文档的section 19.1.1中有记载:

  

某些代码接受index属性来指定名称   该列的索引。 unique-key属性可用于分组   单个单元键约束中的列。目前,指定   unique-key属性的值是 not 用于命名约束,   仅对映射文件中的列进行分组。

但是以下内容:

<property name="A" index="AB" />
<property name="B" index="AB" />

只会生成一个名为“AB”的索引。