nhibernate - 使用 Fluent NHibernate 映射没有 setter 的只读属性

标签 nhibernate fluent-nhibernate

我有一个看起来像这样的域类。我希望 NHibernate 保存 LastUpdate 的当前值插入/更新以便我可以在查询中使用它,但在检索 Foo 时忽略它从数据库中,让对象本身在我实际访问它时重新计算值。

public class Foo {
    public DateTime LastUpdate {
        get {
            /* Complex logic to determine last update by inspecting History */
            return value;
        }
    }
    public IEnumerable<History> History { get; set; }
    /* etc. */
}

我的 Foo 的映射看起来像这样:
public class FooMap : ClassMap<Foo> {
    Map(x => x.LastUpdate)
        .ReadOnly();
    HasMany(x => x.History);
    // etc...
}

我以为 ReadOnly()是我想要完成的,但是当我尝试创建 SessionFactory 时,出现以下异常:

Error: FluentNHibernate.Cfg.FluentConfigurationException: An invalid or incomplete configuration was used while creating a SessionFactory. Check PotentialReasons collection, and InnerException for more detail.
---> NHibernate.PropertyNotFoundException: Could not find a setter for property 'LastUpdate' in class 'Foo'.



该属性没有 setter ,因为它不应该被设置,只能读取。是 ReadOnly()在这里做正确的事?如果不是,那是什么?

(NHibernate v3.0b1,流畅的 NHibernate v1.1)

最佳答案

ReadOnly指示 Fluent NHibernate 不查找此属性的更改,这不等同于编译器世界中的只读属性。您的属性在 NHibernate 的眼中不是只读的,因为您希望它从您的数据库中填充。您需要做的是告诉 NHibernate 它应该通过与该属性同名(小写)的私有(private)字段访问该属性的值。

Map(x => x.LastUpdate)
  .Access.Field();

使用 Field 有几种替代方法,您使用哪一个将取决于您如何命名私有(private)字段。

关于nhibernate - 使用 Fluent NHibernate 映射没有 setter 的只读属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4110141/

相关文章:

c# - 如何将复合外键映射到 FluentNHibernate 中的非主唯一键?

fluent-nhibernate - 为什么我的 NHibernate 查询因 IndexOutOfRangeException 而失败?

c# - 流利的 NHibernate + 禁用 LazyLoad

c# - NHibernate 标准 : Add a constraint for property type

c# - 有没有办法从查询结果中创建 Dictionary<field_name, field_value> 列表?

nhibernate - 命名查询未知错误尝试使用 Fluent NHibernate 调用存储过程

c# - Fluent NHibernate(带自动映射)不以多对多方式保存连接表值

c# - 索引超出数组范围 - NHibernate 3.2

NHibernate 3 LINQ : How to filter IQueryable to select only objects of class T and its subclasses?

c# - 是否有示例说明为什么应在 NHibernate 中覆盖 Equals/GetHashCode?