У меня есть действие 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?
Два варианта:
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
});
}
.Include()
не отображается в Intellisense . Не могли бы вы указать мне на страницу MSDN, которая ссылается на нее, чтобы я мог убедиться, что я не делаю что-то не так?