2

大きなデータオブジェクトがCompressedDataプロパティに格納されているため、クエリを実行するたびにこのデータをロードする必要はありません。だから私はこのクラスをLazyLoad()としてマークしようとしました。 データの圧縮/解凍の機能を提供するUncompressedDataプロパティがあるので、エンティティクラスの外にあるCompressedDataへのアクセスはありません。だから私はTestEntityクラス内でのみCompressedDataを呼び出します。 しかし、私は困っています。 NHibernate 3.2.0.4000(またはFluentNHibernate 1.3.0.717)は、エンティティクラスからこのプロパティへのリクエストがない場合、LazyLoadプロパティをロードしたくありませんでした。テストを実行しようとすると、空の文字列が得られます。エンティティクラス内でアクセスされた場合、LazyLoadedプロパティは動的にロードされません

public class TestEntity { 
    public TestEntity(){} 
    public TestEntity(string otherData, string dataForCompress){ 
     OtherData = otherData; 
     UncompressedData = dataForCompress; 
    } 

    public virtual string OtherData {get;set;}   
    public virtual byte[] CompressedData {get;set;} 
    public virtual string UncompressedData { 
     get { 
      return SomeLongFunctionForDecompress(CompressedData); 
     } 
     set { 
      CompressedData = SomeLongFunctionForCompress(value); 
     } 
    } 
} 

public class TestEntityMapping : ClassMap<TestEntity> { 
    public TestEntityMapping(){ 
     Map(OtherData); 
     Map(CompressedData).LazyLoad(); 
    } 
} 

[Test] 
public void can_readLazyLoadedProperty(){ 

    TestEntity obj1 = new TestEntity("test","long data here"); 
    using (nHibernateHelper.CreateNewSession(){ 
     Session.Save(obj1); 
    } 
    using (nHibernateHelper.CreateNewSession(){ 
     TestEntity obj2 = Session.Get(obj1.Id); 
     //byte[] data1 = obj2.CompressedData; 
     string data2 = obj2.UncompressedData; 
     Assert.AreEqual("long data here",data2); 
    }    
} 

ただし、コメントを外すとbyte[] data1 = obj2.CompressedData;行がすべて正常に機能します。たぶん、私はいくつかの属性をCompressedDataプロパティに追加するか、マッピングにいくつかのプロパティを追加する必要がありますか?

答えて

2

私は、.NETは、Javaと同様のメカニズムを与え、あなたの説明から、そのようになるようだとしますLazyLoadは

に取り組んでいるように

Hibernateはゲッターを変更し、独自のオブジェクトでそれらをラップするエンティティクラスを、修正

内部からゲッタを呼び出すと、LazyLoadを処理しないゲッタの変更されていないバージョンが呼び出されます。

これは機能であり、バグではありません。解決策は、エンティティの外部でロジックを動かすことです。フィールドとアクセサのみが必要です。

関連する問題