NHibernate-遅延読み込みコレクション-動作していません
-
05-07-2019 - |
質問
NHibernateマニュアルを誤解したか、何か間違ったことをしました。誰でも助けることができますか?
AuditLogEntrysなしでユーザーを取得しようとしています。 しかし、NHibernateはまだAuditLogEntrysをロードしています。プロパティにアクセスするときにのみAuditLogEntrysをロードします。
public class User
{
public virtual int UserId { get; set; }
public virtual string UserName { get; set; }
public virtual IList<AuditLogEntry> AuditLogEntrys { get; set; }
}
public class AuditLogEntry
{
public virtual int Id { get; set; }
public virtual DateTime DateRead { get; set; }
public virtual string MachineName { get; set; }
}
マッピング:
<class name="Model.User, Model"
table="User"
lazy="true">
<id name="UserId" access="property" column="UserID">
<generator class="native"></generator>
</id>
<property name="UserName" access="property" />
<bag name="AuditLogEntrys" lazy="true" access="property">
<key column="UserID" />
<one-to-many class="Model.AuditLogEntry, Model"></one-to-many>
</bag>
<class name="Model.AuditLogEntry, Model"
table="AuditLog"
lazy="true">
<id name="Id" access="property" column="ID">
<generator class="native"></generator>
</id>
<property name="DateRead" access="property" column="DateRead"></property>
<property name="MachineName" access="property" column="MachineName"></property>
</class>
ユーザーを取得するコード:
public IList<User> GetUserByUserName(string userName)
{
ICriteria criteria = NHibernateSession.CreateCriteria(typeof(User))
.Add(Expression.Eq("UserName", userName));
return GetByCriteria(criteria);
}
今、AuditLogEntryの空のコレクションを持つUserオブジェクトを期待していましたが、これは実際に起こっていることではありません。
アイデアはありますか?? ありがとう。
解決
遅延読み込みでは、オブジェクトのリストが表示されますが、まだ「水和」されていません。データベースから。遅延ロードされたオブジェクトはエンティティタイプではなく、「プロキシオブジェクト」です。コレクション内のアイテムにアクセスすると、実際のデータが入力/水和されます。
プロキシオブジェクトを使用することが、すべてのプロパティをエンティティタイプで仮想化する必要がある理由です。プロキシタイプは、エンティティタイプの動的に生成されたサブクラスであり、プロパティにアクセスすると、データベースを実際に呼び出します。
あなたの質問は理解できたと思いますが、違いは空のリストではなく、実際のオブジェクトを取得することです。空のリストを取得した場合、データベース内のユーザーを参照するAuditLogEntryアイテムがなかったことを意味します。
所属していません StackOverflow