MVC多对多视图

时间:2013-11-13 22:52:31

标签: c# asp.net-mvc entity-framework asp.net-mvc-4

我的项目再次出现问题。 我有两个使用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的新手,所以如果有人能向我解释如何让它成功,我将非常感激。

3 个答案:

答案 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);
    }
}