2009-09-04 9 views
1

Comment accéder à une propriété chargée paresseuse d'un modèle ActiveRecord à partir de la vue?ASP.NET MVC 1.0 et Castle ActiveRecord 2.0 Chargement paresseux

J'ai un modèle de nouvelles appartenant à un modèle de catégorie, les deux qui sont marqués comme Lazy = true

Je suis en mesure d'accéder à une propriété chargée paresseux à mon avis en procédant comme suit dans mon contrôleur

using (new SessionScope()) 
{ 
    results = _service.FindAllNews(start, pageSize, new[] { Order.Asc("Id") }); 
    foreach (var result in results) 
    { 
     var category = result.Category; 
    } 
} 
return View(results); 

Puis, à mon avis, je Parse à travers les résultats et afficher le titre de la catégorie avec le

suivant
<%= Html.Encode(item.Category.Title) %> 

Il est évident que si je ne fait pas référence à la i propriété Dans mon contrôleur, j'obtiens une erreur de portée de session lorsque j'essaie d'appeler la propriété dans la vue.

Mais cela me semble faux. Y a-t-il une meilleure façon d'initialiser les propriétés de chargement paresseux d'un modèle avant d'atteindre la vue? Je suppose que je pourrais écrire une fonction Init dans le modèle, mais cela semble aussi bidon.

+1

Je suis tombé sur la même chose avec NHibernate régulière. Je devais finir par déplacer ma transaction vers BeginRequest et EndRequest. – mxmissile

+0

Votre commentaire devrait être une réponse, mxmissile. Avoir un seul SessionScope par requête résoudrait son problème, bien que vous deviez faire attention en utilisant des vidages automatiques. – wtaniguchi

+0

Oui, mais je ne suis pas familier avec AR SessionScope ou AR d'ailleurs, pas sûr si son utilisation transaciton est la même que NHibernate régulière, en d'autres termes ne se sentait pas qualifié .. ;-) – mxmissile

Répondre

3

Je me suis tourné vers le groupe google google et j'ai trouvé la réponse que je cherchais. Je pensais que je partagerais avec tout le monde ici au cas où quelqu'un d'autre cherche la même chose.

Pour modifier l'endroit où les étendues de session sont créées et détruites pour un chargement paresseux avec ActiveRecord, vous devez ajouter ce qui suit à votre fichier web.config.

<system.web> 
    <httpModules> 
     <add 
      name="ar.sessionscope" 
      type="Castle.ActiveRecord.Framework.SessionScopeWebModule, Castle.ActiveRecord" /> 
    </httpModules> 
</system.web> 

Cela change lorsque la portée de session est créé et disposé de manière à correspondre à la portée de la session par demande ici http://www.castleproject.org/activerecord/documentation/trunk/usersguide/web.html.

3

La solution simple est: N'effectuez pas de chargement paresseux dans votre vue. La vue dans MVC par définition n'a rien à charger.

C'est au contrôleur de le faire pour que vous puissiez tester ce comportement.

Et oui, vous n'avez pas besoin de définir cela dans vos mappages. Vous pouvez interroger vos objets avec un autre Fetchmode afin qu'ils soient rapidement chargés dans ce cas particulier.

+0

Alors que la réponse marquée est directement ce que l'utilisateur demandait, c'est une meilleure réponse. La vue ne doit pas faire quoi que ce soit qui touche la base de données. – ConsultUtah