NHibernate通过session.Load()创建代理,但不是通过Linq或Criteria API
我目前的项目有一个奇怪的问题。查询的延迟加载不起作用。当我查询列表时,nhibernate分别获取所有关联 我提取了它的一小部分,并将其放入一个单独的解决方案中。基本上我现在得到的是一个Account表和一个AccountSync表。两者都有一个ID和一个URL,而ID只是一个db guid 我的课程是:NHibernate通过session.Load()创建代理,但不是通过Linq或Criteria API,nhibernate,lazy-loading,criteria,Nhibernate,Lazy Loading,Criteria,我目前的项目有一个奇怪的问题。查询的延迟加载不起作用。当我查询列表时,nhibernate分别获取所有关联 我提取了它的一小部分,并将其放入一个单独的解决方案中。基本上我现在得到的是一个Account表和一个AccountSync表。两者都有一个ID和一个URL,而ID只是一个db guid 我的课程是: public class HippoAccount { public virtual Guid Id { get; set; } public virtual string U
public class HippoAccount
{
public virtual Guid Id { get; set; }
public virtual string Url { get; set; }
public virtual HippoAccountSync Sync { get; set; }
}
public class HippoAccountSync
{
public virtual Guid Id { get; set; }
public virtual string Url { get; set; }
public virtual HippoAccount Account { get; set; }
}
现在通过对象的guid加载对象时:
var account = session.Load<HippoAccount>(accountId);
Console.WriteLine(NHibernateUtil.IsPropertyInitialized(account, "Sync"))
。。。属性Sync
被初始化(触发第二个select查询),并且返回的对象不是代理
这是默认行为吗?我做错了什么
映射为:
<class name="HippoAccount" table="AllAccounts">
<id name="Id" type="guid">
<generator class="guid"/>
</id>
<property name="Url" />
<many-to-one
class="HippoAccountSync"
name="Sync"
not-found="ignore"
property-ref="Url">
<column name="url" />
</many-to-one>
</class>
<class name="HippoAccountSync"
mutable="false"
table="Accounts">
<id name="Id" type="guid">
<generator class="guid"/>
</id>
<property name="Url">
<column name="serviceUri" />
</property>
<many-to-one class="HippoAccount"
name="Account"
property-ref="Url"
not-found="ignore">
<column name="serviceUri" />
</many-to-one>
</class>
经过相当多的研究,我找到了答案。答案,因为在NHibernate中有很多东西可以防止延迟加载
session.Load()
获取项目时,您会得到一个代理。但是,只要您访问任何属性,比如Url
,就会获取对象,包括所有不支持延迟加载的关联not found=“ignore”
时,它无法决定是将属性设置为null还是为给定的可能无效的外键设置代理。这可能通过拦截属性访问来解决not found=“ignore”
和property ref
时,架构导出将生成强制循环引用的约束。不好的!然后,正确的映射将是受约束的一对一关系,其中HippoAccountSync
的键必须有一个生成器foreign
<class name="HippoAccount" table="AllAccounts">
<id name="Id" type="guid">
<generator class="guid"/>
</id>
<property name="Url" />
<many-to-one
class="HippoAccountSync"
name="Sync"
not-found="ignore"
property-ref="Url">
<column name="url" />
</many-to-one>
</class>
<class name="HippoAccountSync"
mutable="false"
table="Accounts">
<id name="Id" type="guid">
<generator class="guid"/>
</id>
<property name="Url">
<column name="serviceUri" />
</property>
<many-to-one class="HippoAccount"
name="Account"
property-ref="Url"
not-found="ignore">
<column name="serviceUri" />
</many-to-one>
</class>