我在当前项目中有一个奇怪的问题。延迟加载查询不起作用。当我查询列表时,nhibernate会分别提取所有关联。NHibernate通过session.Load()创建代理,但不通过Linq或Criteria API
我提取了它的小部分,并将其放入单独的解决方案。基本上我现在得到的是帐户表和帐户同步表。两者都有一个ID和一个URL,而ID只是一个db-guid。
我的类别是:
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"))
...返回false
和账户本身就是一个代理。
但通过标准API时加载列表:
var account = (HippoAccount)session
.CreateCriteria(typeof (HippoAccount))
.Add(Restrictions.Eq("Id", accountId))
.List()[0];
...财产Sync
被初始化(烧成第二选择查询),并且返回的对象不是代理。
这是默认行为吗?我错了什么?
的映射是:
<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>
不知道这是否是完全相关的,但也有问题,与未找到= “忽略”: http://nhjira.koah.net/browse/NH-1001 http://guildsocial.web703 .discountasp.net/dasblogce/CommentView,guid,ba00b19d-bd60-442b-b2e7-935277a9f1eb.aspx – 2009-10-29 18:11:49
你说得对。另一个问题是property-ref - 它也会禁用延迟加载。 http://maonet.wordpress.com/2007/12/05/lazy-load-conflicts-with-property-ref-in-many-to-one-mapping/ – 2009-10-30 12:01:42