我有一个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之前加载此类数据?
答案 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
});
}