如果仅在实体类中访问,则不会动态加载LazyLoaded属性

时间:2011-11-12 18:55:06

标签: nhibernate fluent-nhibernate nhibernate-mapping lazy-loading

我有一些大数据对象,存储在CompressedData属性中,所以当我进行任何查询时,我不想每次都加载这些数据。所以我试图在映射类中将此属性标记为LazyLoad()。 从实体类中无法访问CompressedData,因为我有UncompressedData属性,它提供压缩/解压缩数据的功能。所以我只在TestEntity类中调用CompressedData。 但我遇到了麻烦。如果实体类中没有对此属性的请求,NHibernate 3.2.0.4000(或FluentNHibernate 1.3.0.717)不想加载LazyLoad属性。如果尝试运行测试,我将得到一个空字符串。

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属性添加一些属性或者为映射添加一些属性?

1 个答案:

答案 0 :(得分:2)

我认为.NET提供了与Java类似的机制,并且从您的描述中看起来就是这样:

Hibernate修改实体类将它们包装在自己的对象中,修改getter以便LazyLoad正在工作

从内部调用getter调用未修改的getter版本,这些版本不处理LazyLoad。

所以你得到的是功能,而不是bug。解决方案可能是在实体外部移动逻辑,它应该只有字段和访问器。