現在のプロジェクトに奇妙な問題があります。クエリの遅延読み込みが機能しません。リストをクエリすると、nhibernate はすべての関連付けを個別に取得します。
その小さな部分を抽出し、別のソリューションに入れました。基本的に私が今持っているのは、Account-Table と AccountSync-Table です。どちらにも 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
が初期化され (2 番目の選択クエリが起動されます)、返されたオブジェクトはプロキシではありません。
それはデフォルトの動作ですか?私は何を間違えていますか?
マッピングは次のとおりです。
<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>