0

私はこの問題を理解するのに助けが必要です。私はActiveRecordMediatorでリポジトリ パターンを使用しています。私はセッションスコープhttp モジュールを有効にしました。私のクラスにはActiveRecord(Lazy = true)とマークされています。城ActiveRecordレイジーローディングNOT Working

問題は、FindAllまたはSlicedFindAllを実行するたびに、メディエータが 代理の代わりに初期化された要素のコレクションを返すということです。誰かが私を正しい方向に向けることができますか?

これは私のリポジトリです:私はFindAllメソッドを実行すると

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; } 
     } 
    } 
} 

は、DocumentEntityのバージョン アレイ内のすべてのオブジェクトではなく DocumentVersionEntityProxyのDocumentVersionEntityであり、すべてのintializedです。

私は間違っていますか?

あなたがManyRelationCascadeEnum.AllDeleteOrphanに設定し、あなたのカスケードの振る舞いを持って、次のコードで
+0

クロス投稿(回答あり):http://groups.google.com/group/castle-project-users/browse_thread/thread/863f02fbc6ba52e8 –

+1

私はキャッスルプロジェクトグループにも聞くことができると思いました。それでも、私の場合は答えはありません。 –

答えて

0

[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()などのfindメソッドでのみ発生し、Get()を実行すると遅延が正しく読み込まれます。 –

+0

getを使用している場合は、休止状態が正常に動作しています。これはウェブアプリですか?その場合は、ActiveRecordのisweb設定がtrueに設定されていること、またリクエストごとにセッションを使用する必要があることを確認する必要があります。http://using.castleproject.org/display/AR/Enable+Session+per+Request –

関連する問題