NHibernate:如何为类属性禁用虚拟化?

时间:2010-03-10 10:04:16

标签: nhibernate virtual

我如何使用NHibernate公共方法(非虚拟)?

我有这段代码:

public string crewNumber
    {
        get
        {
            return this.crewNumberField;
        }
        set
        {
            this.crewNumberField = value;
        }
    }

注意我的所有类,属性,方法和接口都是自动生成的,我不想手动更改它们。

上面的代码产生了这个错误:

  

以下类型不得用作   proxies:...方法get_crewNumber   应该是'公共/受保护的虚拟'

我看到可以使用简单的仅公开属性here

  

在我们上面的例子中,我们已经制作了   属性和构造函数public    - 但这不是NHibernate的要求 - 它可以使用public,   受保护的,内部的,甚至是私人的   用于保存数据的属性。

默认情况下如何关闭此虚拟文件?

这让我发疯了。我真的很想在Visual Studio中拖动一个数据适配器并一劳永逸地结束这种荒谬的情况; - )

由于

2 个答案:

答案 0 :(得分:7)

指定不应该为该类使用动态代理,方法是在类映射上指定lazy = false。

像这样:

 <class name="MyClass" table="MyTable" lazy="false">
 </class>

这意味着你不能在NHibernate中使用动态代理。 更清楚: - 当您检索一个能够使用动态代理的类实例时,您将收到一个“空实例”。也就是说,NHibernate还不会从数据库中获取数据。您将获得一个对象,其中将会填充Id,但其他属性则不会。只有当您访问属性时,NHibernate才会从数据库加载数据。这就是为什么属性需要是虚拟的原因,因为NHibernate将在内部创建类的子类,并覆盖属性以便它可以实现此行为。

我总是在我的类映射上指定'lazy = false',因为我不希望虚拟属性出于与基础架构相关的原因,而不是“域相关”。

(请注意,这与延迟加载关联无关;当您不使用动态代理时,仍然可以延迟加载它们。)

答案 1 :(得分:0)

lazy="false"放在类映射:

<class name="MyClass" table="MY_TABLE" lazy="false">