Nhibernate 如果仅在实体类内部访问,LazyLoaded属性不会动态加载

Nhibernate 如果仅在实体类内部访问,LazyLoaded属性不会动态加载,nhibernate,fluent-nhibernate,nhibernate-mapping,lazy-loading,Nhibernate,Fluent Nhibernate,Nhibernate Mapping,Lazy Loading,我有一些大数据对象,存储在CompressedData属性中,所以我不想每次执行任何查询时都加载这些数据。所以我尝试在mapping类中将这个属性标记为LazyLoad()。 在实体类外无法访问CompressedData,因为我有UncompressedData属性,该属性提供了压缩/解压缩数据的功能。所以我只在TestEntity类中调用CompressedData。 但我遇到了麻烦。如果实体类外没有对此属性的请求,NHibernate 3.2.0.4000(或FluentNHibernat

我有一些大数据对象,存储在CompressedData属性中,所以我不想每次执行任何查询时都加载这些数据。所以我尝试在mapping类中将这个属性标记为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);   
    }            
}
公共类测试{
公共测试实体(){}
公共测试实体(字符串otherData、字符串dataForCompress){
OtherData=OtherData;
UncompressedData=dataForCompress;
}
公共虚拟字符串OtherData{get;set;}
公共虚拟字节[]压缩数据{get;set;}
公共虚拟字符串解压数据{
得到{
返回一些长函数进行压缩(压缩数据);
}
设置{
CompressedData=SomeLongFunctionForCompress(值);
}
}
}
公共类TestEntityMapping:ClassMap{
公共测试映射(){
地图(其他数据);
Map(CompressedData).LazyLoad();
}
}
[测试]
public void可以读取LazyLoadedProperty(){
TestEntity obj1=新的TestEntity(“测试”,“此处的长数据”);
使用(nHibernateHelper.CreateNewSession(){
Session.Save(obj1);
}
使用(nHibernateHelper.CreateNewSession(){
TestEntity obj2=Session.Get(obj1.Id);
//字节[]数据1=obj2.CompressedData;
字符串数据2=obj2.UncompressedData;
AreEqual(“此处的长数据”,data2);
}            
}

但是,如果取消注释
byte[]data1=obj2.compressedata;
line,一切正常。也许我需要为compressedata属性添加一些属性,或者为映射添加一些属性?

我想.NET提供了与Java类似的机制,从您的描述来看,似乎是这样的:

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

从内部调用getter可以调用未修改版本的getter,它不处理LazyLoad

所以这就是你得到的特性,而不是bug。解决方案可以是将逻辑移到实体之外,实体应该只有字段和访问器