流畅的Nhibernate和Sql Server私有setter错误

Joh*_*y_D 8 setter compiler-errors fluent-nhibernate sql-server-2008

我正在尝试用流畅的nhibernate和sql server express完成第一步,在我的项目中添加这些功能.但是有些错误.因为我是nhibernate的新手,一段时间无法解决问题.我有一个实体

Id { get; private set; }
Run Code Online (Sandbox Code Playgroud)

存取.并且此实体映射到sql server中具有标识{1,1}列的表.但在创建Session工厂期间,我收到一个错误:

The following types may not be used as proxies:Entity: method set_Id should be 'public/protected virtual' or 'protected internal virtual'
Run Code Online (Sandbox Code Playgroud)

我知道私有的setter用于封装这个属性的设置,但为什么我会得到这个错误呢?PS:关于nhibernate的流利网站的例子是使用sqllite db,一切都很好.

Tom*_*ell 20

这个问题给包括我在内的许多NH/FNH用户带来了悲痛.

直到最近,NHibernate还允许私有的setter使用代理对象.但是从NH 3.2开始,不再允许私有设置者 - 它们必须是"' 公共/受保护的虚拟'或'受保护的内部虚拟 '",正如错误信息所示.

对于许多FNH/NH示例代码而言,这是一个重大变化,对于新手来说尤其令人困惑.


Esp*_*rud 7

将该属性声明为public virtual int Id { get; protected set; }.然后NHibernate生成的代理对象将能够设置该属性.

另一个解决方案是使用支持字段:

private int id;
public int Id
{
  get { return id; }
}
Run Code Online (Sandbox Code Playgroud)

然后使用映射:

Map(x => x.Id).Access.CamelCaseField(); 
Run Code Online (Sandbox Code Playgroud)