【问题标题】:Fluent NHibernate - Is it possible to map a property to a persisted computed column in Sql ServerFluent NHibernate - 是否可以将属性映射到 Sql Server 中的持久计算列
【发布时间】:2013-01-27 11:55:18
【问题描述】:

我想使用 Fluent NHibernate 将只读属性映射到 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)");
}

【问题讨论】:

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


    【解决方案1】:

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

    您需要执行以下操作:

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

    请注意,您将需要空设置器,否则 NHibernate 会抱怨

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

    【讨论】:

    • 谢谢,但是通过这种方式,subName 没有映射到数据库中的列,我无法在其上创建索引。
    • 您的意思是不可能将属性映射到 NHibernate 中的计算列。那么它可以成为一个新功能吗?
    • 不,可以将属性映射到计算列。你想映射它做什么?如果要查询,则只需从映射中删除 .Formula 调用
    • 我希望 NHibernate 填充 Sql Server 中列的公式部分。这可能吗?我映射了属性,然后自己在 Sql Sever 中填写公式部分。它有效,但我宁愿由 NHibernate 完成。
    • 如果你使用自己的数据库对象是可能的,但我认为这比它的价值更麻烦
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多