流畅的NHibernate - 是否可以将属性映射到Sql Server中的持久计算列

时间:2013-02-12 08:08:51

标签: nhibernate fluent-nhibernate fluent-nhibernate-mapping calculated-columns database-indexes

我想使用Fluent NHibernate将readonly属性映射到Sql Server中的计算列。 该属性是另一个属性的子串。我这样做是为了使子串可索引并具有更好的搜索性能。但是当我在映射中使用公式函数时,该属性不会映射到数据库中的计算列,但是在使用查询时会计算它。

Class Person{
   public virtual string name {get; set;}
   public virtual string subName {get; set;}
}

Class PersonMap : ClassMap<Person>{
   Map(p => p.name);
   Map(p => p.subName).Generated.Always().Formula("substring(name, 0, 5)");
}

1 个答案:

答案 0 :(得分:3)

您需要复制代码中的功能 - 如果更改name属性,NHibernate默认情况下不会向数据库发送新查询以评估生成的属性。

您需要执行以下操作:

 public virtual string subName { get { return name.Substring(0, 5); } set { } }

请注意,你需要空的setter,否则NHibernate会抱怨

编辑:我看到您要索引数据库中的列,因此您需要在数据库中为该表创建计算列。这本身与NHibernate无关,您可以在映射中完全忽略该列(只要在代码中复制它),或者删除.Formula(..)部分(因为它在计算列中指定)已)