0

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オブジェクトを期待していましたが、これは起こっていることではありません。

何か案は??ありがとう。

4

1 に答える 1

3

遅延読み込みを使用すると、オブジェクトの入力リストが取得されますが、データベースからはまだ「ハイドレイト」されていません。遅延ロードされたオブジェクトはエンティティタイプではなく、コレクション内のアイテムにアクセスしたときに実際のデータが入力/ハイドレイトされる「プロキシオブジェクト」です。

プロキシオブジェクトを使用することが、エンティティタイプですべてのプロパティを仮想化する必要がある理由です。プロキシタイプは、エンティティタイプの動的に生成されたサブクラスであり、プロパティにアクセスしたときにデータベースを実際に呼び出します。

うまくいけば、私はあなたの質問を理解しましたが、違いは、空のリストではなく、実際のオブジェクトを取り戻すことです。空のリストが返される場合は、データベース内のユーザーを参照するAuditLogEntryアイテムがなかったことを意味します。

于 2009-09-09T16:45:01.997 に答える