当从数据库中检索内容并通过控制器和视图可视化时,如何以优雅和健壮的方式混合ASP.NET MVC和实体框架的概念?
下面的示例将抛出Dispose异常,因为在关闭using语句后将显示View。
// code in controller
using (var usersDb = new UsersDb(new WebSecurityWrapper()))
{
var user = usersDb.GetUser(User.Identity.Name);
return View(user);
}
// code in usersDb model -- GetUser method
public User GetUser(string name)
{
var id = _webSecurity.GetUserId(name);
var user = Users.FirstOrDefault(usr => usr.Id == id);
return user;
}
非常明显,但我能想到的唯一选择是“克隆”用户对象,以便View可以独立显示它。这感觉不对。
那么这样做的恰当方法是什么?
答案 0 :(得分:1)
我认为您在视图中使用了User对象的导航属性。这些可能是以懒惰的方式评估的。
在退出方法之前,将创建User对象。不知何故,您正在请求在视图中查询的额外信息。但由于处置已经发生,因此导致例外。
一种选择是使用Include立即查询额外的必要数据。
答案 1 :(得分:0)
User user;
using (var usersDb = new UsersDb(new WebSecurityWrapper()))
{
user = usersDb.GetUser(User.Identity.Name);
}
return View(user);