2014-01-19 97 views
19

我知道這個問題被問了很多次。我已閱讀並實施所有解決方案,但未取得成功。我在使用EF檢索數據庫中的數據時遇到此錯誤,並在View上使用此模型後與模型綁定。該操作無法完成,因爲DbContext已經使用MVC處理4

我的控制器代碼是

using System.Linq; 
using System.Web.Mvc; 
using JsonRenderingMvcApplication.Models; 

namespace JsonRenderingMvcApplication.Controllers 
{ 
    public class PublisherController : Controller 
    { 
     public ActionResult Index() 
     { 
      PublisherModel model = new PublisherModel(); 
      using (DAL.DevelopmentEntities context = new DAL.DevelopmentEntities()) 
      {    
       model.PublisherList = context.Publishers.Select(x => 
             new SelectListItem() 
             { 
              Text = x.Name, 
              Value = x.Id.ToString() 
             }); ; 
          } 
      return View(model); 
     } 

    } 
} 

我的視圖代碼是

@model JsonRenderingMvcApplication.Models.PublisherModel 

@{ 
    ViewBag.Title = "Index"; 
} 
<div> 
    @Html.DisplayFor(model=>model.Id) 
    @Html.DropDownListFor(model => model.Id, Model.PublisherList); 
</div> 
<div id="booksDiv"> 

</div> 

我的模型代碼

using System.Collections.Generic; 
using System.Web.Mvc; 
using System.ComponentModel.DataAnnotations; 

namespace JsonRenderingMvcApplication.Models 
{ 
    public class PublisherModel 
    { 
     public PublisherModel() 
     { 
      PublisherList = new List<SelectListItem>(); 
     } 

     [Display(Name="Publisher")] 
     public int Id { get; set; } 
     public IEnumerable<SelectListItem> PublisherList { get; set; } 
    } 
} 

我實體的代碼是

namespace JsonRenderingMvcApplication.DAL 
{ 
    using System; 
    using System.Collections.Generic; 

    public partial class Publisher 
    { 
     public Publisher() 
     { 
      this.BOOKs = new HashSet<BOOK>(); 
     } 

     public int Id { get; set; } 
     public string Name { get; set; } 
     public string Year { get; set; } 

     public virtual ICollection<BOOK> BOOKs { get; set; } 
    } 
}  

是的,這個實體有一個導航屬性,但我不想要那個實體數據,所以我不想包含它。

謝謝

+0

什麼行會拋出異常? – wdosanjos

+0

@wdosanjos這行「@ Html.DropDownListFor(model => model.Id,Model.PublisherList);」拋出一個異常作爲職位的標題 –

+0

雖然沒有直接與這個問題聯繫,但我有相同的錯誤有趣的發現。我有這個unitOfWork類(具有dbcontext對象)和類ABC。 ABC類通過unitOfWork類使用dbContext對象。 ABC類和unitOfWork類都通過windsor城堡DI容器得到實例化。我得到了非常相同的錯誤,問題是我在DI容器的初始化過程中註冊了ABC類。我寫過代碼,如Register(Component.For ().ImplementedBy ()**。LifeStyle.Transient **)我錯過了粗體代碼以結束這個問題。 – RBT

回答

59

您遇到的問題是由於LINQ的延期執行。對於那些還沒有意識到LINQ是如何工作的開發者來說,這是一個棘手的問題。我有一篇很棒的博客文章,但核心概念是,您必須在集合上強制枚舉以使LINQ代碼立即運行而不是稍後運行。這意味着改變這一點:

model.PublisherList = context.Publishers.Select(x => 
    new SelectListItem() 
    { 
     Text = x.Name, 
     Value = x.Id.ToString() 
    }); 

這樣:

model.PublisherList = context.Publishers.Select(x => 
    new SelectListItem() 
    { 
     Text = x.Name, 
     Value = x.Id.ToString() 
    }).ToList(); 

注意.ToList()有迫使枚舉。

你的LINQ查詢是推遲這意味着它不是在你的控制器上運行,而是之後,可能在你的視圖中,你循環集合(強制枚舉並因此運行LINQ)。因爲您使用using語句來處理數據庫上下文(這當然是好的做法),所以在到達視圖之前會處理上下文,該視圖會根據處置的上下文執行代碼。強制在using語句中枚舉將在當時運行代碼,而不是稍後在處理上下文時運行代碼,並阻止此問題。

+0

感謝您的回覆。你能解釋一下'.ToList()'是什麼嗎? +1給你。 –

+2

優秀的答案。 @Sandeep。如果您對.ToList()做些什麼感到好奇,我強烈建議閱讀文檔。 http://msdn.microsoft.com/en-us/library/bb342261%28v=vs.110%29.aspx –

+1

@Sandeep當然,請參閱David對'.ToList()'的評論。它基本上創建了可枚舉對象的列表。 – Haney

相關問題