我在當前項目中有一個奇怪的問題。延遲加載查詢不起作用。當我查詢列表時,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