2010-11-25 10 views
2

ich eine ASP.NET MVC 2 Aktion haben, die wie folgt aussieht:Umgebung "Datacontext zugegriffen nach Entsorgen" Fehler in ASP.NET MVC-Ansicht

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

Die Ansicht enthält den folgenden Code:

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

Ich greife auf item.PostTags, die durch meine DataContext erhalten wird. Hier verwende ich im Wesentlichen Lazy-Loading, aber ich bekomme einen Fehler: mein DataContext ist bereits entsorgt, wenn es Zeit ist, diese PostTags aufzulisten.

Wie kann ich solche Daten laden, bevor mein DataContext entsorgt wird?

+0

Don verwenden Entsorgen Sie den DataContext nicht. Siehe http://leedumond.com/blog/about-disposing-the-datacontext/ und http://stackoverflow.com/questions/821574/c-linq-to-sql-should-datacontext-be-disposed-using-using- idisposable –

Antwort

6

zwei Optionen:

1) manuell Entsorgen DC (zB Application_EndRequest in Global.asax)

2) Eager Last item.Tags in Controller:

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

Ich würde Option 2 , da Option 1 ohne den Einsatz eines DI-Containers riskant ist. (was du offensichtlich nicht benutzt).

EDIT

Sorry - ich dachte, Sie Entity Framework verwendet haben, ist hier die L2SQL Äquivalent "eager loading":

Sie benötigen Dataload

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

Also für jede Eigenschaft, die ich eifrig laden muss, mache ich nur: '.Include (" PropertyName ")? Groß! Dies löst meine kurzfristigen Bedürfnisse, aber ich werde sicher sein, in Abhängigkeit Injektion zu sehen. –

+0

Hmm ... ** '.Include()' wird nicht in Intellisense angezeigt **. Können Sie mich auf eine MSDN-Seite verweisen, die darauf verweist, damit ich sicherstellen kann, dass ich nicht etwas falsch mache? –

+0

Oh Mist, warte mal - du benutzt L2SQL, ich dachte du benutzt Entity Framework. Mein Fehler. 'Include' ist EF-spezifisch. Wird meine Antwort aktualisieren. – RPM1984