在NHibernate 3.3中通过代码进行映射时,如何在表上设置检查约束?
即以下hbm的等效代码:
<class name="myclass" table="mytable" check="(col1 = col2 AND col2 > col3)">
... columns ...
</class>
"check"
属性不能由NHibernate 3.3 中的mapping-by-code
设置
将约束脚本作为辅助数据库对象添加到NH配置中似乎有效,尽管这不是最干净的解决方案。。
config.AddAuxiliaryDatabaseObject(new SimpleAuxiliaryDatabaseObject("ALTER TABLE mytable ADD CONSTRAINT myconstraint CHECK (col1 = col2 AND col2 > col3)",
"ALTER TABLE mytable DROP CONSTRAINT myconstraint"));
在NHibernate 4.0.0-Alpha2中添加了奇异表检查支持;列检查可能在此之前,但我不确定何时。
假设您有以下声明:
var mapper = new ConventionModelMapper();
列检查可以这样添加:
mapper.Class<EntityType>(en => {
en.Property(x => x.Name, pm => {
pm.Column(c => c.Check("Name > ''''"));
})
}
遗憾的是,由于某些原因,无法在类映射中添加类检查。此外,只支持一次检查。如果指定了多个检查,则最后一个检查获胜。这可以通过"与"将检查链接为一个来解决。完整的解决方法如下:
mapper.BeforeMapClass += (inspect, member, custom) => {
if (member.GetType() == typeof(EntityType)) {
custom.Check("Name > '''' AND Creator > ''''");
}
}