MVC 3 – ObjectContext实例已被释放,不能再用于需要连接的操作

我对C#和MVC很新,我一直在创建自己的小博客网站作为测试项目。 虽然大多数事情都在发挥作用,但我在从LINQ查询中选择多个列时遇到了问题。 只有在关于SO的问题上遇到磕磕绊绊之后,才意识到我可以使用生成的实体类作为强类型模型来处理这个问题。 我需要这个,因为我一直在创建一个数据库层(这也是我之前没有用过的东西)并试图通过该层传递匿名类型不起作用。 我理解为什么会这样,所以我很满意我正朝着正确的方向前进。

然而,这种方法似乎给了我另一个问题。 我尝试过一个简单的测试,从我的Categories表中检索2列:CategoryID和Name。 我最初尝试了以下内容:

using (MyEntities db = new MyEntities()) { var model = from c in db.Categories select new Category { CategoryID = c.CategoryID, Name = c.Name }; return View(model); } 

这给了我在尝试迭代视图中的模型时ObjectContext被处置错误。 在阅读完这个问题后 ,我尝试将return语句移到using块之外,并在模型上调用AsEnumerable(),如下所示:

 IEnumerable model; using (MyEntities db = new MyEntities()) { model = from c in db.Categories select new Category { CategoryID = c.CategoryID, Name = c.Name }; } return View(model.AsEnumerable()); 

但是,当我尝试在视图中迭代模型时,这仍然给我相同的ObjectContext配置错误。 所以现在我不明白为什么我得到错误。 我甚至尝试完全删除using指令,但这给了我一个不同的错误:

“无法在LINQ to Entities查询中构造实体或复杂类型’MyProjectModel.Category’。”

如果有帮助,这是我的观点的相关代码:

 @model IEnumerable @foreach (var category in Model) { 

@category.Name

}

有人会善意地告诉我我错过了什么吗?

谢谢。

在控制器中急切并在处理之前调用.ToList()以便在离开using块之前立即执行查询(之后为时已晚,上下文消失了):

 using (MyEntities db = new MyEntities()) { var model = from c in db.Categories select new Category { CategoryID = c.CategoryID, Name = c.Name }; return View(model.ToList()); // <-- .ToList() here } 

现在,虽然这将解决您的特定问题,但开发人员或dependency injection框架通常做的是在BeginRequest事件中实例化DbContext ,将其存储在HttpContext.Items以便在整个请求的执行过程中以及在整个请求内部可用EndRequest方法,从HttpContext检索它并处理它。


更新:

此外,最好使用仅包含您要在此特定视图中使用的属性的视图模型:

 public class CategoryViewModel { public int Id { get; set; } public string Name { get; set; } } 

然后在你的行动中:

 public ActionResult Index() { using (MyEntities db = new MyEntities()) { var model = from c in db.Categories select new CategoryViewModel { Id = c.CategoryID, Name = c.Name }; return View(model.ToList()); } } 

并在视图中:

 @model IEnumerable @foreach (var category in Model) { 

Id: @category.Id Name: @category.Name

}