Обход ошибки «Доступ к DataContext после удаления» в представлении ASP.NET MVC

2

У меня есть действие 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. Здесь я использую lazy-load, но я получаю сообщение об ошибке: мой DataContext уже настроен, когда приходит время, чтобы перечислить эти PostTags.

Как я могу загрузить такие данные до размещения моего DataContext?

Теги:
asp.net-mvc
linq-to-sql
datacontext

1 ответ

6
Лучший ответ

Два варианта:

1) Вручную удалите DC (например, Application_EndRequest в Global.asax)

2) Ожидаемая нагрузка 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
            });
        }
  • 0
    Поэтому для каждого свойства, которое мне нужно загрузить, я просто делаю: `.Include (" PropertyName ")? Большой! Это решает мои краткосрочные потребности, но я обязательно посмотрю на внедрение зависимости.
  • 0
    Хм ... .Include() не отображается в Intellisense . Не могли бы вы указать мне на страницу MSDN, которая ссылается на нее, чтобы я мог убедиться, что я не делаю что-то не так?
Показать ещё 5 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню