考虑如下对象:
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 的配置。我在这里想念什么?