2013-01-01 81 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

相關問題