Замок ActiveRecord Lazy-Loading НЕ работает - PullRequest
0 голосов
/ 15 декабря 2010

Мне нужна помощь в понимании этой проблемы. Я использую репозиторий шаблон с 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, все объекты в версиях массивом DocumentEntity являются DocumentVersionEntity вместо DocumentVersionEntityProxy и все они инициализированы.

Что я делаю не так?

1 Ответ

0 голосов
/ 22 декабря 2010

В следующем коде у вас установлено каскадное поведение 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].

...