我有一些我想懒加载的实体类型。但是,它们有一些内部(汇编)字段,但不在该类之外使用。这些字段是编译器生成的(F#),我无法更改它们。示例例外是:
NHibernate.InvalidProxyTypeException: 以下类型不能用作 代理:Mappings.MTest:field id @ 47 不应该是公开的也不是内部的
我理解为什么NHibernate会这样做,以及如果有字段,如果我访问它们会弄乱生成的代理的延迟加载属性。但是,既然我知道我不会使用这些字段,我能以某种方式覆盖NHibernate吗?
有什么办法可以说“忽略这个字段”吗?我正在使用Fluent NHibernate,如果这样可以更容易。
编辑:我还应该注意,我正在使用NHibernate 2.1.0 Alpha 2。
Edit2:这里的主要要点是我想要启用LazyLoading,这意味着我必须使用代理生成。禁用LazyLoading工作(没有代理),但sorta违背了像NHibernate这样的好框架的目的。
答案 0 :(得分:17)
我重新组装了NHibernate(比获取源代码和重建更容易)并删除了内部/公共字段上的错误代码。如果没有检查,LazyLoading似乎工作得很好。 (虽然,我是NHibernate的新手,所以可能有一些我不知道的情况。)
修改强> 啊,有一个属性“use_proxy_validator”将禁用所有验证检查。够好了。
Fluently.Configure()
.ExposeConfiguration(fun cfg ->
cfg.Properties.Add("use_proxy_validator", "false"))...
答案 1 :(得分:5)
只需将 lazy 属性设置为false,
即可 <class name="OrderLine" table="OrderLine" lazy="false" >
您可以阅读更多内容: NHibernate必须虚拟一切吗? - http://davybrion.com/blog/2009/03/must-everything-be-virtual-with-nhibernate/
奥菲尔, www.TikalK.com
答案 2 :(得分:1)
您可以使用
[XmlIgnore]
用于装饰字段的属性:)
答案 3 :(得分:1)
您是否可以使用界面声明“已使用”字段?http://nhibernate.info/doc/nh/en/index.html#persistent-classes-poco-sealed
“另一种可能性是让类实现一个声明所有公共成员的接口”
我不知道NH是否使用与JAVA版本相同的@transient注释/属性来忽略持久操作中的属性。
答案 4 :(得分:0)
您可能需要查看this page,其中概述了如何使用F#和Fluent NHibernate。
修改我刚注意到您的用户名。或许我认为这是你的博客吗?我多么愚蠢。它似乎确实解决了你的问题,特别是“我们从禁用LazyLoad开始,因为大多数属性都不是虚拟的,NHibernate将无法验证映射。相反,我们显式LazyLoad事情,如Store引用。”?也许我只是误解了这个问题。