2010-11-25 50 views
2

J'ai une action ASP.NET MVC 2 qui ressemble à ceci:Aux environs "DataContext accessibles après Éliminez" erreur dans ASP.NET MVC Voir

public ActionResult Index() 
    { 
     using(var db = new MyDataContext()) 
     { 
      var welcomeSnippet = "test"; 
      var articles = db.Posts.Where(p => p.DateOfPublish <= DateTime.Now).Take(5).ToList(); 
      return View(new HomeViewModel() 
      { 
       Articles = articles, 
       WelcomeSnippet = welcomeSnippet 
      }); 
     } 
    } 

La vue comprend le code suivant:

<%foreach (var item in Model.Articles) 
{%> 
    <div class="article" id="<%=item.PostID %>"> 
      <!-- some properties --> 
      <div class="tags">tags: <i><%foreach (var tag in item.PostTags.ToList()) 
             { %><%=Html.Encode(tag.Tag.TagName.Trim())%> <%} %></i> 
      </div> 
    </div> 
<% } %> 

J'accède à item.PostTags, qui est obtenu via mon DataContext. Ici, j'utilise essentiellement le chargement paresseux, mais je reçois une erreur: mon DataContext est déjà éliminé au moment de lister ces PostTags.

Comment puis-je charger ces données avant de disposer de mon DataContext?

+0

Don Disposez le DataContext. Voir http://leedumond.com/blog/about-disposing-the-datacontext/ et http://stackoverflow.com/questions/821574/c-linq-to-sql-should-datacontext-be-disposed-using- idisposable –

Répondre

6

Deux options:

1) manuellement Éliminez DC (par exemple Application_EndRequest dans Global.asax)

2) Charge Désireuse item.Tags Contrôleur:

using(var db = new MyDataContext()) 
     { 
      var welcomeSnippet = "test"; 
      var articles = db.Posts.Include("PostTags").Where(p => p.DateOfPublish <= DateTime.Now).Take(5).ToList(); 

      return View(new HomeViewModel() 
      { 
       Articles = articles, 
       WelcomeSnippet = welcomeSnippet 
      }); 
     } 

Je voudrais aller l'option 2 , comme l'option 1 est risquée sans l'utilisation d'un conteneur DI. (que vous n'utilisez évidemment pas).

EDIT

Désolé - je pensais que vous utilisiez Entity Framework, voici l'équivalent L2SQL de "chargement impatient":

Vous devez utiliser DataLoadOptions

using(var db = new MyDataContext()) 
     { 
      var dataLoadOptions = new DataLoadOptions(); 
      dataLoadOptions.LoadWith<Post>(x => x.PostTags); 
      db.LoadOptions = dataLoadOptions; 

      var welcomeSnippet = "test"; 
      var articles = db.Posts.Where(p => p.DateOfPublish <= DateTime.Now).Take(5).ToList(); 

      return View(new HomeViewModel() 
      { 
       Articles = articles, 
       WelcomeSnippet = welcomeSnippet 
      }); 
     } 
+0

Donc pour chaque propriété que j'ai besoin de charger, je fais juste: '.Include (" PropertyName ")? Génial! Cela résout mes besoins à court terme, mais je serai sûr de se pencher sur l'injection de dépendance. –

+0

Hmm ... ** '.Include()' n'apparaît pas dans Intellisense **. Pourriez-vous me diriger vers une page MSDN qui fait référence pour que je puisse m'assurer que je ne fais pas quelque chose de mal? –

+0

Oh merde, tenez - votre utilisation de L2SQL, je pensais que vous utilisiez Entity Framework. Ma faute. 'Inclure 'est spécifique à EF. Mettra à jour ma réponse. – RPM1984