2014-01-19 43 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

相关问题