使用nhibernate按代码映射时,在表上设置CHECK约束

时间:2013-06-25 03:03:44

标签: nhibernate nhibernate-mapping

在NHibernate 3.3中按代码映射时,如何在表上设置检查约束?

即。代码等效于以下hbm:

<class name="myclass" table="mytable" check="(col1 = col2 AND col2 > col3)">
 ... columns ...
</class>

3 个答案:

答案 0 :(得分:1)

NHibernate 3.3中的"check"无法设置mapping-by-code属性

答案 1 :(得分:1)

将约束脚本添加到NH配置作为辅助数据库对象似乎有效,尽管不是最干净的解决方案..

config.AddAuxiliaryDatabaseObject(new SimpleAuxiliaryDatabaseObject("ALTER TABLE mytable ADD CONSTRAINT myconstraint CHECK (col1 = col2 AND col2 > col3)",
            "ALTER TABLE mytable DROP CONSTRAINT myconstraint"));

答案 2 :(得分:0)

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 > ''''");
  }
}