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

时间:2012-10-19 22:07:15

标签: c# .net nhibernate fluent-nhibernate

我将表单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就可以了。

所以我有两个问题:

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

  2. 为什么(以及如何)使用带有支持字段的readonly属性?

1 个答案:

答案 0 :(得分:7)

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

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