代码之家  ›  专栏  ›  技术社区  ›  harriyott Erik Funkenbusch

Fluent NHibernate和计算属性

  •  4
  • harriyott Erik Funkenbusch  · 技术社区  · 15 年前

    我正在使用FluentNHibernate,并自动映射类。

    我在一个类中有一个沿着

    public virtual DateTime? LastActionTimeStamp
    {
        get {
            return Actions.Count == 0 ? null : Actions.OrderByDescending(
                a => a.TimeStamp).ElementAt(0).TimeStamp;
        }
    }
    

    这没有映射到其他属性,因此我不能在icriteria限制中使用它。我添加了一个空的setter(正如我在某个地方看到的那样,这样做将把它包括在映射中,它确实做到了),但现在我得到了一个nhibernate错误:

    无法执行查询…列名“lastActionTimestamp”无效。

    所以我的问题是:如何告诉Fluent nhibernate让nhibernate忽略这个属性的数据库,但仍然返回属性get的计算值?

    3 回复  |  直到 10 年前
        1
  •  2
  •   John_    15 年前

    您可以将公式与属性关联,并使用它而不是C代码。例如

    财产:

    private int _postCount = 0;
    public virtual int PostCount
    {
        get
        {
            return _postCount;
        }
    }
    

    公式:

    (SELECT count(p.ID) FROM BlogPost p WHERE p.BlogID = ID and p.IsDeleted = 0)
    

    然后你可以像往常一样在表达中使用postcount。记住在FluentMapping中对属性设置访问修饰符。不确定Fluent支持什么,但我为Normal Mapping找到的选项是:

    * property
    * field
    * field.camelcase
    * field.camelcase-underscore
    * field.pascalcase-m-underscore
    * field.lowercase-underscore
    * nosetter.camelcase
    * nosetter.camelcase-underscore
    * nosetter.pascalcase-m-underscore
    * nosetter.lowercase-underscore
    

    最好查阅NHibernate文档以获得正式列表 Access Strategies 因此,您将访问策略与命名策略结合在一起,例如“field.lowercase underline”

        2
  •  1
  •   harriyott Erik Funkenbusch    15 年前

    我不确定你能用NHibernate来做,但我可能是错的。nhibernate将您的条件转换为SQL,因此该属性将不可用于查询(它不在数据库中!).

    但是,如果我错了(这是经常发生的),您应该能够用一个覆盖映射它。

    在自动应用设置中,创建 override 并使用 Access 属性来告诉nhibernate如何处理它。

    像这样:

    AutoMap.AssemblyOf<YourEntity>()
      // automapping stuff
      .Override<ThatClass>(m =>
      {
        m.Map(x => x.LastActionTimeStamp)
          .Access.None();
      });
    
        3
  •  1
  •   Jérôme Verstrynge    13 年前

    您还可以覆盖映射并忽略属性:

    public class ThatClassMappingOverride : IAutoMappingOverride<ThatClass>
    {
      public void Override(AutoMapping<ThatClass> mapping)
            {
                mapping.IgnoreProperty(x=> x.PropertyToIgnore);
            }
    }
    
    推荐文章