Свойство LazyLoaded не загружается динамически, если доступ осуществляется только внутри класса сущности - PullRequest
2 голосов
/ 12 ноября 2011

У меня есть несколько больших объектов данных, хранящихся в свойстве CompressedData, поэтому я не хочу загружать эти данные каждый раз, когда делаю какой-либо запрос. Поэтому я попытался пометить это свойство как LazyLoad () в классе отображения. Нет доступа к CompressedData вне класса сущности, потому что у меня есть свойство UncompressedData, которое дает мне функциональность сжатия / распаковки данных. Поэтому я вызываю CompressedData только внутри класса TestEntity. Но у меня проблема. 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 Ответ

2 голосов
/ 21 ноября 2011

Полагаю, .NET предоставляет механизм, аналогичный Java, и из вашего описания это выглядит так:

Hibernate изменяет классы сущностей, оборачивая их в свои собственные объекты, которые модифицируют геттеры, так что LazyLoad работает

Вызывая геттеры изнутри, вы вызываете неизмененную версию геттеров, которые не обрабатывают LazyLoad.

Так что это то, что вы получаете, это функция, а не ошибка. Решением может быть перемещение логики за пределы сущности, которая должна иметь только поля и средства доступа.

...