我如何使用NHibernate公共方法(非虚拟)?
我有这段代码:
public string crewNumber
{
get
{
return this.crewNumberField;
}
set
{
this.crewNumberField = value;
}
}
注意我的所有类,属性,方法和接口都是自动生成的,我不想手动更改它们。
上面的代码产生了这个错误:
以下类型不得用作 proxies:...方法get_crewNumber 应该是'公共/受保护的虚拟'
我看到可以使用简单的仅公开属性here:
在我们上面的例子中,我们已经制作了 属性和构造函数public - 但这不是NHibernate的要求 - 它可以使用public, 受保护的,内部的,甚至是私人的 用于保存数据的属性。
默认情况下如何关闭此虚拟文件?
这让我发疯了。我真的很想在Visual Studio中拖动一个数据适配器并一劳永逸地结束这种荒谬的情况; - )
由于
答案 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">