2011-09-15 6 views
0

を通じて私はこのようなインターフェイスていません:NHibernateのは、セッションの外部IDを返しますが、プロパティ

public interface ICoreType { 
    int TypeID {get;} 
} 

そして、このようにそれを実装NHibernateのクラス:

public class DueDateType : ICoreType { 
    public virtual int DueDateTypeID {get;set;} 
    ... 
    public virtual int TypeID { get{ return this.DueDateTypeID; } } 
} 

はここに私のマッピングです。

<class name="DueDateType" table="tdfDueDateType" lazy="true" > 
    <cache usage="read-write" include="all"/> 
    <id name="DueDateTypeID" column="DueDateTypeID" > 
     <generator class="identity"/> 
    </id> 
    ... 
    </class> 

私はNHibernateからオブジェクトのインスタンスを取得し、それをオブジェクトのスコープの外に返します。それが作成されたアクティブなセッション、私は値DueDateTypeIDを得ることができますが、ちょうど良い、しかしTypeIDにアクセスすると、LazyInitializationExceptionがスローされます。私は単純にDueDateTypeIDの値が何であれ返すように、TypeIDのマッピングはありません。

マッピングでlazy = "false"とマークすると、問題が消去されます。私が読んできたことから、それは非遅延マッピングされたクラスのために生成されたプロキシがないからです。

この場合、NHibernateの遅延ロード機能を使用したいと思います。 NHibernateにこのプロパティを別々に扱わせるために、IInterceptorやそのようなものを実装する必要がありますか?

答えて

3

問題は、エンティティのすべてのメンバーが(idを除いて)アクセス時に遅延初期化をトリガーすることです。 NHはあなたが実際にメンバー内でやっていることを知ることができません。セッション外で遅延初期化をトリガすると、エラーが発生します。

提案:

  • セッション外のエンティティへのアクセスを避けるようにしてください。遅延ロードをオフにするときだけ安全です。通常は移動する方法ではありません。
  • idをラップしないでください。 TypeIDにアクセスすると、エンティティは初期化されますが、必要ではありませんが、パフォーマンスが悪いです。
関連する問題