2013-01-01 36 views
1

当从数据库中检索内容并通过控制器和视图对其进行可视化时,如何以优雅和健壮的方式混合使用ASP.NET MVC和entityframework的概念?在ASP.NET MVC中检索数据库中的内容

下面的示例将抛出Dispose异常,因为View将在using语句关闭后显示。

 // 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

在使用之外分配'user'然后?下面是一个关于数据库mvc的好教程:http://www.asp.net/mvc/tutorials/older-versions/movie-database/create-a-movie-database-application-in-15-minutes-with-asp- net-mvc-cs –

+0

你能显示usersDb.GetUser()方法体吗? –

+0

嗨基里尔我更新了与执行GetUser问题。 – bas

回答

1

我想你是在视图中使用User对象的导航属性。这些可能是以懒惰的方式评估的。

User对象在退出方法之前创建。不知何故,你要求在视图中查询额外的信息。但是由于处置已经发生,这导致了例外。

一种选择是使用Include来立即查询额外的必要数据。

+0

非常感谢马尔滕!这是现货! – bas

0
User user; 
    using (var usersDb = new UsersDb(new WebSecurityWrapper())) 
    { 
     user = usersDb.GetUser(User.Identity.Name); 
    } 

    return View(user); 
+0

您好格雷格,thx的建议,但由于用户对象在using语句的范围之外(即在视图中)使用,导致完全相同的问题。删除使用语句的作品,但正如我在上面的评论中提到的,感觉有点棘手,因为只要垃圾收集器决定完成usersDb对象,就会调用dispose方法。 – bas

+1

好吧,你有没有想过使用存储库和工作单元的风格模式 - 这是一个非常有效和易于实现的设置,它也是非常广泛的使用,很好地记录在这里:http://www.asp.net/mvc/教程/开始 - 使用-ef-using-mvc /实现 - 存储库和工作单元 - 模式-as-asp-net-mvc-application –

+0

立即阅读它。伟大的链接!读完后会回复。也是一个链接到TDD与MVC/EF(!!)。 – bas

相关问题