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

Wah*_*aly 15 nhibernate nhibernate-mapping fluent-nhibernate

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

Ste*_*ger 16

为多个属性分配索引/唯一约束名称

<property name="A" index="AB" />
<property name="B" index="AB" />
Run Code Online (Sandbox Code Playgroud)

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

<property name="A" index="AB, ABC" />
<property name="B" index="AB, ABC" />
<property name="C" index="ABC" />
Run Code Online (Sandbox Code Playgroud)

但是有一个错误.我还写了一个补丁.如果您对此感兴趣,请投票支持该错误或添加评论或其他内容.

编辑:刚刚检查了错误发生了什么.它在版本2.1.0中修复,因此它现在应该完美地工作.非常感谢伟大的NHibernate开发团队!

  • 对于Fluent NHibernate,你必须使用SetAttribute,它使它类​​似于:Map(x => xA).SetAttribute("index","AB"); (3认同)

Jak*_*les 14

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

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

<property name="A" unique-key="AB" />
<property name="B" unique-key="AB" />
Run Code Online (Sandbox Code Playgroud)

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


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

例如,上面的代码不会生成一个名为"AB"的唯一索引,而是类似的东西UQ__TableName__7944C87104A02EF4.

这在NHibernate文档的第19.1.1节中有记录:

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

但是以下内容:

<property name="A" index="AB" />
<property name="B" index="AB" />
Run Code Online (Sandbox Code Playgroud)

将只生成一个名为"AB"的索引.