Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
除非类…lazy=true,否则NHibernate不会创建代理_Nhibernate_Nhibernate Mapping - Fatal编程技术网

除非类…lazy=true,否则NHibernate不会创建代理

除非类…lazy=true,否则NHibernate不会创建代理,nhibernate,nhibernate-mapping,Nhibernate,Nhibernate Mapping,考虑以下对象: public partial class Record { public int RecordID {get; set;} public DateTime? Created { get; set; } public int CreatorUserUserObjectNDX { get; set; } public UserObject Creator { get; set; } ... } 及 它们的映射如下: <hibernate

考虑以下对象:

public partial class Record
{
    public int RecordID {get; set;}
    public DateTime? Created { get; set; }
    public int CreatorUserUserObjectNDX { get; set; }
    public UserObject Creator { 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>


在这里,它们故意保持简单,在现实中,一对多的收藏会让它们更加厚重,但这些都很有效,所以它们不是重点

我遇到的问题是,当我使用像这样的定义和映射,并执行一个简单的

var results = session.QueryOver<Record>()
  .List();
var results=session.QueryOver()
.List();
NHibernate没有为
creator
属性创建代理,它只是在执行的SQL语句中使用左外部联接,并直接插入
UserObject
。 当我在UserObject的映射中将
lazy='false'
更改为
lazy='true'
时,将创建代理,并且执行的SQL没有外部联接

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


我使用的是NHibernate 3.2,因此没有关于proxyfactory的配置。我在这里遗漏了什么?

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


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

但我的问题是,NH进行急切加载,除非我在类映射中指定lazy=true,并且我希望进行惰性加载,而不是默认情况下急切地进行惰性加载。由于类声明中的lazy=“false”,NH在您的案例中进行了急切加载。哦,天哪。。。现在我明白了。我的类映射的默认规则就是原因?所以这确实意味着,当我将lazy设置为false时,这种类型的延迟加载是不可能的?不确定,这就是为什么我更喜欢离开NH做他的工作,并在每个查询的基础上设置自定义行为。所以,是的,这对我来说已经足够作为一个答案了。。。谢谢你的时间!
<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();