2012-10-19 30 views
3

我升级形式NHibernate的3.2 NHibernate的3.3,我在我的领域类中定义一个像这样的很多虚拟成员:为什么nhibernate 3.3不允许在ICollection上使用private setter?

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的决定禁止使用私人setter方法呢?它看起来不像从.net中的技术限制,因为它之前被支持,我不应该从设计的角度来做,因为我们应该使用Collection Remove(),Add()等方法来操作但为什么允许受保护的公共设置者呢?

  2. 为什么(以及如何)使用readonly属性和后台工作?

回答

6

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

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

+0

谢谢Firo ..你有一个想法之前他们使用什么,他们现在使用什么? – kabaros

+0

Fluent-NHibernates defalut是城堡动态代理,集成(与ILmerge)是LinFu动态代理。但我不知道为什么林福有这种限制/设计选择。你仍然可以使用城堡与NHibernates适配器,但它不再支持 – Firo

+0

thx @DiegoMijelshon有用的信息。 – Firo

相关问题