在ASP.NET MVC视图中解决“Dispose之后访问的DataContext”错误

时间:2010-11-25 00:27:10

标签: c# asp.net asp.net-mvc linq-to-sql datacontext

我有一个ASP.NET MVC 2动作,如下所示:

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

该视图包含以下代码:

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

我正在访问item.PostTags,这是通过我的DataContext获取的。在这里,我实际上是在使用延迟加载,但是我收到了一个错误:我的DataContext在列出那些PostTag时已经处理好了。

如何在放置DataContext之前加载此类数据?

1 个答案:

答案 0 :(得分:6)

两个选项:

1)手动处理DC(例如Global.asax中的Application_EndRequest)

2)在Controller中预先加载item.Tags

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

我会选择2,因为选项1在没有使用DI容器的情况下存在风险。 (你显然没有使用)。

修改

抱歉 - 我以为你在使用Entity Framework,这里是L2SQL相当于“渴望加载”:

您需要使用 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
            });
        }