0

我需要一些幫助來理解這個問題。我正在使用ActiveRecordMediator存儲庫 模式。我已啓用會話範圍http 模塊,用ActiveRecord標記我的類(Lazy = true)。Castle ActiveRecord懶惰加載不工作

問題是,我每次執行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和都intialized。

我在做什麼錯?

+0

交叉發佈(附答案):http://groups.google.com/group/castle-project-users/browse_thread/thread/863f02fbc6ba52e8 – 2010-12-15 20:24:31

+1

是的,我想我也可以在城堡項目組中提問。儘管如此,我的情況仍然沒有回答。 – 2010-12-15 22:24:00

回答

0

在下面的代碼你有你的級聯行爲設置爲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]。

+0

那麼,我試過你的解決方案。似乎是有道理的..但設置完所有並刪除級聯行爲後,整個實體仍在加載。此外,這隻發生在像findAll(),SlicedFindAll()等查找方法,當我做一個Get()它懶加載正確。 – 2010-12-22 22:01:45

+0

如果使用得到它然後休眠工作正常。這是一個網絡應用程序?如果是這樣,您需要確保ActiveRecord的isweb配置設置設置爲true,並且您應該使用每個請求的會話:http://using.castleproject.org/display/AR/Enable+Session+per+Request – 2010-12-23 12:33:19