Ленивая загрузка Castle ActiveRecord НЕ работает

Мне нужна помощь в понимании этого вопроса. Я использую шаблон репозитория с ActiveRecordMediator. Я включил http-модуль области сеанса, пометил свои классы ActiveRecord (Lazy = true).

Проблема в том, что каждый раз, когда я выполняю FindAll или SlicedFindAll, посредник возвращает набор инициализированных элементов вместо прокси. Может ли кто-нибудь указать мне в правильном направлении?

Это мой репозиторий:

public interface IEntityRepository<TEntity>
{
    IList<TEntity> FindAll(int page, int pageSize, out int resultCount);
}

public class EntityRepository<TEntity> : IEntityRepository<TEntity> 
{
    public virtual IList<TEntity> FindAll(int page, int pageSize)
    {
        return (IList<TEntity>)ActiveRecordMediator.SlicedFindAll(typeof(TEntity), (page * pageSize), pageSize);
    }
}

[ActiveRecord(Lazy = true)]
public class DocumentEntity
{
    private Guid _id;
    private IList<DocumentVersionEntity> _versions;

    [PrimaryKey(PrimaryKeyType.GuidComb, "Id")]
    public virtual Guid Id
    {
        get { return _id; }
        set { _id = value; }
    }

    [HasAndBelongsToMany(typeof(DocumentVersionEntity), RelationType.Bag, Table = "DocumentEntriesToDocumentVersions", ColumnKey = "DocumentEntryId", ColumnRef = "DocumentVersionId", Cascade = ManyRelationCascadeEnum.AllDeleteOrphan, Lazy = true)]
    public virtual IList<DocumentVersionEntity> Versions
    {
        get { return _versions; }
        set { _versions = value; }
    }
}

[ActiveRecord(Lazy = true)]
public class DocumentVersionEntity
{
    private Guid _id;

    [PrimaryKey(PrimaryKeyType.GuidComb, "Id")]
    public virtual Guid Id
    {
        get { return _id; }
        set { _id = value; }
        }
    }
}

Когда я выполняю метод FindAll, все объекты в массиве Versions объекта DocumentEntity являются DocumentVersionEntity, а не DocumentVersionEntityProxy, и все они инициализируются.

Что я делаю неправильно?


person Luis Aguilar    schedule 15.12.2010    source источник
comment
перекрестный пост (с ответами): groups.google.com/ группа/замок-проект-пользователи/browse_thread/   -  person Mauricio Scheffer    schedule 15.12.2010
comment
Да, я подумал, что могу спросить и в группе проекта Castle. Тем не менее, нет ответа на мой случай.   -  person Luis Aguilar    schedule 16.12.2010


Ответы (1)


В следующем коде поведение каскада установлено на ManyRelationCascadeEnum.AllDeleteOrphan:

 [HasAndBelongsToMany(typeof(DocumentVersionEntity),
                     RelationType.Bag,
                     Table = "DocumentEntriesToDocumentVersions", 
                     ColumnKey = "DocumentEntryId", 
                     ColumnRef = "DocumentVersionId", 
                     Cascade = ManyRelationCascadeEnum.AllDeleteOrphan, 
                     Lazy = true)]
    public virtual IList<DocumentVersionEntity> Versions
    {
        get { return _versions; }
        set { _versions = value; }
    }

Это вынуждает Nhibernate, к лучшему или к худшему, загружать всю коллекцию, чтобы выполнить очистку сирот. Вам придется избавиться от каскадного поведения, чтобы оно заработало. Это также верно для NotFoundBehavior, настроенного на игнорирование, [читать здесь][1]: http://blog.agilejedi.com/2010/12/nhibernateactiverecord-lazy-loading.html [1].

person Agile Jedi    schedule 21.12.2010
comment
Что ж, я попробовал ваше решение. Казалось, это имеет смысл... но после настройки и удаления каскадного поведения весь объект все еще загружается. Кроме того, это происходит только в методе поиска, таком как FindAll(), SlicedFindAll() и т. д., когда я выполняю Get(), он лениво загружается правильно. - person Luis Aguilar; 23.12.2010
comment
Если вы используете get, то hibernate работает нормально. Это веб-приложение? Если это так, вам нужно убедиться, что для параметра конфигурации isweb для ActiveRecord установлено значение true, И вы должны использовать сеанс для каждого запроса: using.castleproject.org/display/AR/Enable+Session+per+Request - person Agile Jedi; 23.12.2010