我有一个看起来像这样的域类。我希望 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/