2

考虑如下对象:

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直接插入 a。当我更改lazy='false'lazy='true'在 UserObject 的映射中工作时,会创建代理并且执行的 SQL 没有外部连接。

那么,是否有必要lazy='true'为所有类进行设置,这可能是任何地方的参考?我想我可以将所有映射的默认设置为 false,并lazy='proxy'在需要时在多对一定义中设置。

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

4

1 回答 1

3

如果在映射中设置了lazy=false,NHibernate 就不需要创建代理,因为所有的属性都会被急切地加载。

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

于 2012-08-15T11:46:26.910 回答