gpt4 book ai didi

NHibernate 不会创建代理,除非 class...lazy=true

转载 作者:行者123 更新时间:2023-12-04 05:35:46 26 4
gpt4 key购买 nike

考虑这样的对象:

public partial class Record
{
public int RecordID {get; set;}
public DateTime? Created { get; set; }
public int CreatorUserUserObjectNDX { get; set; }
public UserObject Creator { get; set; }
...
}


public partial class UserObject
{
public virtual int ID {get; set;}
public virtual string Name {get; set;}
}

以及它们的映射,例如:
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" schema="..." namespace="..." assembly="...">
<class name="Record" table="records" lazy="false" schema="..">
<id name="RecordID" column="ndx">
<generator class="native" />
</id>
<property name="Created" column="created" />
<property name="CreatorUserUserObjectNDX" column="creator_user_user_object_ndx" />

<many-to-one name="Creator" column="creator_user_user_object_ndx" lazy="proxy"/>
</class>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" schema="..." namespace="..." assembly="...">
<class name="UserObject" table="user_objects" lazy="false">
<id name="NDX" column="ndx">
<generator class="native" />
</id>

<property name="Name" column="name" />
</class>

它们在这里有意保持简单,实际上它们在一对多集合等中更重,但是这些工作,所以它们不是这里的重点。

我遇到的问题是,当我使用这些定义和映射时,做一个简单的
var results = session.QueryOver<Record>()
.List();

NHibernate 不会为 creator 创建代理属性,它只是在执行的 SQL 语句中使用左外连接并插入一个 UserObject直接。
当我改变 lazy='false'lazy='true'在它工作的 UserObject 映射中,创建了代理并且执行的 SQL 没有外部联接。

那么,是否严格需要设置 lazy='true'对于所有类(class),这可能是任何地方的引用?我想我可以使用将所有映射的默认值设置为 false 并设置 lazy='proxy'在多对一的定义中,在需要时。

我使用 NHibernate 3.2,所以没有关于 proxyfactory 的配置。我在这里缺少什么?

最佳答案

如果您在映射中设置 lazy=false,则 NHibernate 无需创建代理,因为所有属性都将被急切加载。

您不应该更改延迟加载设置,除非您需要进行预先加载。即便如此,您也可以使用“fetch”(例如在 hql 中)来急切地加载您需要的内容。

关于NHibernate 不会创建代理,除非 class...lazy=true,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11968590/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com