为什么nhibernate 3.3不允许在ICollection上使用私有的setter?

我将表单nhibernate 3.2升级到nhibernate 3.3,我在我的域类中定义了很多虚拟成员,如下所示:

public virtual ICollection<Movie> Movies { get; private set; }

这在升级后停止工作,我得到了这个例外:

Following types may not be used as proxies:
ClassName: method set_Movies should be 'public/protected virtual' or 'protected internal virtual'

现在我设法通过将setter更改为protected来解决问题,但我也很惊讶,将Collection属性更改为只有一个支持字段的readonly就可以了 .

所以我有两个问题:

  • 为什么NHibernate决定不允许使用私人制定者?它看起来不像.net之前的技术限制,因为它之前得到了支持,我不应该从设计的角度来看它,因为我们应该使用Collection Remove(),Add()等方法来操作它然后为什么允许受保护和公共制定者?

  • 为什么(以及如何)使用带有支持字段的只读属性?

回答(1)

2 years ago

NHibernate将Proxy生成器集成到它的程序集中(如果我错了,请纠正我)所使用的实现无法处理私有setter .

但是,如果没有setter,它会尝试搜索支持字段(因为否则无法设置它),readonly是编译时功能,并在使用反射时被忽略 .