4

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

我在一个类中有一个计算属性,类似于

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

这没有与其他属性映射,所以我不能在 ICriteria 限制中使用它。我添加了一个空设置器(因为我在某处读到这样做会将它包含在映射中,它确实如此),但现在我收到了 NHibernate 错误:

无法执行查询...列名“LastActionTimeStamp”无效。

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

4

3 回答 3

2

您可以将公式与属性相关联并使用它而不是 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 支持什么,但我为法线映射找到的选项是:

* 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 文档,以便将访问策略与命名策略结合起来,例如“field.lowercase-underscore”

于 2010-03-05T14:36:32.920 回答
1

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

但是,如果我错了(这很常见),您应该能够使用覆盖来映射它。

在您的自动映射设置中,创建一个覆盖并使用该属性显式映射该Access属性以告诉 NHibernate 如何处理它。

像这样的东西:

AutoMap.AssemblyOf<YourEntity>()
  // automapping stuff
  .Override<ThatClass>(m =>
  {
    m.Map(x => x.LastActionTimeStamp)
      .Access.None();
  });
于 2010-03-05T13:35:41.703 回答
1

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

public class ThatClassMappingOverride : IAutoMappingOverride<ThatClass>
{
  public void Override(AutoMapping<ThatClass> mapping)
        {
            mapping.IgnoreProperty(x=> x.PropertyToIgnore);
        }
}
于 2011-01-18T13:32:42.433 回答