NHibernate中为何非得将所有属性设为virtual?
- 内容介绍
- 文章标签
- 相关推荐
本文共计1279个文字,预计阅读时间需要6分钟。
上一篇文章主要探讨NHibernate实现的优点,而本文则完全是抒发感慨。NHibernate有一个弊端,那就是当与数据库产生映射的类存在时,必须要求所有的public成员和protected成员都是virtual的。请注意这一点。
上一篇文章主要是在夸NHibernate实现的好,而这篇就完全是来抱怨的了。NHiberante有个毛病,就是如果是和数据库产生映射的类,就要求所有的public成员和protected成员必须是virtual的。请注意这里的要求有两个细节:
- 即使是方法,也必须标记为virtual
- 即时是不和数据库有映射关系的属性,也必须标记为virtual
这就让我觉得无厘头了,为什么没有任何关系的东西也要受到限制?我知道NHiberante要求将属性标记为virtual是为了延迟加载,因为只有这样它才能生成如上一篇文章中那样的延迟代理类,这样就可以实现只在第一次访问属性的时候才进行“加载”操作,从而访问数据库并获得数据,再填充字段。不过我认为这也不是合适的理由,因为这又关没有映射的属性,甚至方法什么事情呢?我在很长一段时间内一直没有想明白这个问题。
直到看了NHibernate开发团队成员Davy Brion的文章《Must Everything be Virtual with NHiberante?》之后,我才了解了他们的设计思路——虽然我还是不认同。我真的不喜欢到处virtual。
要求类中所有的公开成员(public/protected)都是virtual,是因为NHibernate想要保证在“访问任何公开成员”之前,数据已经被加载了。
本文共计1279个文字,预计阅读时间需要6分钟。
上一篇文章主要探讨NHibernate实现的优点,而本文则完全是抒发感慨。NHibernate有一个弊端,那就是当与数据库产生映射的类存在时,必须要求所有的public成员和protected成员都是virtual的。请注意这一点。
上一篇文章主要是在夸NHibernate实现的好,而这篇就完全是来抱怨的了。NHiberante有个毛病,就是如果是和数据库产生映射的类,就要求所有的public成员和protected成员必须是virtual的。请注意这里的要求有两个细节:
- 即使是方法,也必须标记为virtual
- 即时是不和数据库有映射关系的属性,也必须标记为virtual
这就让我觉得无厘头了,为什么没有任何关系的东西也要受到限制?我知道NHiberante要求将属性标记为virtual是为了延迟加载,因为只有这样它才能生成如上一篇文章中那样的延迟代理类,这样就可以实现只在第一次访问属性的时候才进行“加载”操作,从而访问数据库并获得数据,再填充字段。不过我认为这也不是合适的理由,因为这又关没有映射的属性,甚至方法什么事情呢?我在很长一段时间内一直没有想明白这个问题。
直到看了NHibernate开发团队成员Davy Brion的文章《Must Everything be Virtual with NHiberante?》之后,我才了解了他们的设计思路——虽然我还是不认同。我真的不喜欢到处virtual。
要求类中所有的公开成员(public/protected)都是virtual,是因为NHibernate想要保证在“访问任何公开成员”之前,数据已经被加载了。

