我的项目再次出现问题。 我有两个使用EF 5 DBContext Generator创建的模型:
首先:
public int ID_AN { get; set; }
public string TITLE_OR { get; set; }
public string TITLE_EN { get; set; }
public virtual ICollection<GENRES> GENRES { get; set; }
第二
public int ID_GE { get; set; }
public string GENRE { get; set; }
public virtual ICollection<ANIME> ANIME { get; set; }
之后我创建了控制器:
public ActionResult Details(int id)
{
using (var db = new MainDatabaseEntities())
{
return View(db.ANIME.Find(id););
}
}
观看:
@model AnimeWeb.Models.ANIME
@{
ViewBag.Title = "Details";
}
<h2>Details</h2>
<fieldset>
<legend>ANIME</legend>
<div class="display-label">
@Html.DisplayNameFor(model => model.TITLE_OR)
</div>
<div class="display-field">
@Html.DisplayFor(model => model.TITLE_OR)
</div>
<div class="display-label">
@Html.DisplayNameFor(model => model.TITLE_EN)
</div>
<div class="display-field">
@Html.DisplayFor(model => model.TITLE_EN)
</div>
</fieldset>
到目前为止一切正常,但我想显示所选动漫的所有类型。当我尝试添加
时<div>
@Html.DisplayFor(model => model.GENRES)
</div>
我收到一个错误:“ObjectContext实例已被处理,不能再用于需要连接的操作。”
我是MVC的新手,所以如果有人能向我解释如何让它成功,我将非常感激。
答案 0 :(得分:1)
实际上这是一个实体框架问题。离开Controller后,你来不及要查询数据库。实体框架是延迟加载(也就是按需)的类型。要解决此问题,您应该更改查询以在检索Anime对象时显式加载类型。
更新:从未告诉你如何做到这一点。有许多方法可以明确地或急切地加载你的类型。最好的资源是阅读MSDN page on Loading Related Entities。一种方法是在控制器中添加与以下类似的代码(我认为这与你如何设置它有关。)
public ActionResult Details(int id)
{
using (var db = new MainDatabaseEntities())
{
var anime = db.ANIME.Find(id);
db.Entry(anime).Collection(a => a.GENRES).Load();
return View(anime);
}
}
答案 1 :(得分:1)
您可以使用“include”扩展方法加载GENRES,如下所示:
db.ANIME.Include("GENRES").Find(id)
如果您想使用@Html.DisplayFor(model => model.GENRES)
显示所有类型,可以使用DisplayTemplates进行显示,请检查ASP.NET MVC display and editor templates。
答案 2 :(得分:0)
在初始化控制器时考虑初始化上下文,并在控制器的dispose方法中处理它。
这是视觉工作室中模板使用的模式(顺便提一下)。
public class DemoController : Controller
{
private MainDatabaseEntities db = new MainDatabaseEntities();
public ActionResult Details(int id)
{
return View(db.ANIME.Find(id));
}
protected override void Dispose(bool disposing)
{
this.db.Dispose();
base.Dispose(disposing);
}
}