0

J'ai besoin d'aide pour comprendre ce problème. J'utilise le modèle de dépôt avec ActiveRecordMediator. J'ai activé le module de la portée de la session http , marqué mes classes avec l'ActiveRecord (Lazy = true). Le problème est que chaque fois que j'effectue un FindAll ou SlicedFindAll, le médiateur retourne une collection d'éléments initialisés au lieu de proxies. Quelqu'un pourrait-il me signaler dans la bonne direction?Castle ActiveRecord Lazy-Loading ne fonctionne pas

Ceci est mon dépôt:

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

Lorsque j'exécute la méthode FindAll, tous les objets dans les versions tableau du DocumentEntity sont DocumentVersionEntity au lieu de DocumentVersionEntityProxy et sont tous intialized.

Qu'est-ce que je fais mal?

+0

cross-posting (avec des réponses): http://groups.google.com/group/castle-project-users/browse_thread/thread/863f02fbc6ba52e8 –

+1

Ouais, j'ai pensé que je pouvais demander aussi dans le groupe de projet Castle. Pourtant, pas de réponse à mon cas. –

Répondre

0

Dans le code ci-dessous vous avez votre comportement en cascade réglé sur 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; } 
    } 

Cela force Nhibernate, pour le meilleur ou le pire, pour charger toute la collection afin de faire le nettoyage orphelin. Vous devrez vous débarrasser du comportement en cascade pour que cela fonctionne. Cela est également vrai du NotFoundBehavior étant mis à ignorer, [lire ici] [1]: http://blog.agilejedi.com/2010/12/nhibernateactiverecord-lazy-loading.html [1].

+0

Eh bien, j'ai essayé votre solution. Cela semblait logique ... mais après avoir configuré et supprimé le comportement en cascade, l'entité entière est toujours en cours de chargement. En outre, cela se produit uniquement sur une méthode de recherche comme FindAll(), SlicedFindAll() et tel, quand je fais un Get() il se charge correctement paresseux. –

+0

Si vous utilisez get, alors hibernate fonctionne correctement. Est-ce une application web? Si c'est le cas, vous devez vous assurer que le paramètre de configuration isweb pour ActiveRecord est défini sur true ET que vous devez utiliser la session par requête: http://using.castleproject.org/display/AR/Enable+Session+per+Request –

Questions connexes