8

我正在尝试使用带有 sql server express 的 fluent nhibernate 完成一些第一步,以在我的项目中添加此功能。但是遇到了一些错误。由于我是休眠的新手,有一段时间无法解决问题。我有一个实体

Id { get; private set; }

访问器。并且该实体映射到 sql server 中具有标识 {1,1} 列的表。但是在创建会话工厂的过程中,我得到了一个错误:

The following types may not be used as proxies:Entity: method set_Id should be 'public/protected virtual' or 'protected internal virtual'

我知道私有设置器用于封装此属性的设置,但是为什么会出现此错误?PS: fluent for nhibernate 网站上的示例正在使用 sqllite db,一切都很好。

4

2 回答 2

20

这是一个让包括我在内的许多 NH/FNH 用户感到悲痛的问题。

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

对于现有的许多 FNH/NH 示例代码来说,这是一个重大更改,并且对新手来说尤其令人困惑。

于 2012-04-20T14:45:16.383 回答
7

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

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

private int id;
public int Id
{
  get { return id; }
}

然后使用映射:

Map(x => x.Id).Access.CamelCaseField(); 
于 2012-04-19T13:36:07.003 回答