忽略NHibernate代理的公共/内部字段

时间:2009-04-12 09:01:03

标签: nhibernate fluent-nhibernate f#

我有一些我想懒加载的实体类型。但是,它们有一些内部(汇编)字段,但不在该类之外使用。这些字段是编译器生成的(F#),我无法更改它们。示例例外是:

  

NHibernate.InvalidProxyTypeException:   以下类型不能用作   代理:Mappings.MTest:field id @ 47   不应该是公开的也不是内部的

我理解为什么NHibernate会这样做,以及如果有字段,如果我访问它们会弄乱生成的代理的延迟加载属性。但是,既然我知道我不会使用这些字段,我能以某种方式覆盖NHibernate吗?

有什么办法可以说“忽略这个字段”吗?我正在使用Fluent NHibernate,如果这样可以更容易。

编辑:我还应该注意,我正在使用NHibernate 2.1.0 Alpha 2。

Edit2:这里的主要要点是我想要启用LazyLoading,这意味着我必须使用代理生成。禁用LazyLoading工作(没有代理),但sorta违背了像NHibernate这样的好框架的目的。

5 个答案:

答案 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引用。”?也许我只是误解了这个问题。