0

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

4

3 回答 3

1

这实际上是一个实体框架问题。一旦你离开你的控制器,你就来不及查询数据库了。实体框架是延迟加载(也就是按需)流派。要解决此问题,您应该更改查询以在检索 Anime 对象时显式加载流派。

更新:从来没有告诉你怎么做。有很多方法可以显式或急切地加载您的流派。最好的资源是阅读有关加载相关实体的 MSDN 页面。一种方法是在您的控制器中添加与以下类似的代码(我认为这适用于您的设置方式)。

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);             
    }
}
于 2013-11-13T22:55:18.480 回答
1

您可以使用“包含”扩展方法来加载 GENRES,如下所示:

db.ANIME.Include("GENRES").Find(id)

如果你想用来@Html.DisplayFor(model => model.GENRES)显示所有的类,你可以用 DisplayTemplates 来做,检查这个ASP.NET MVC 显示和编辑器模板

于 2013-11-14T03:02:21.403 回答
0

考虑在控制器初始化时初始化上下文,并在控制器的 dispose 方法中处理它。

这是 Visual Studio 中的模板使用的模式(顺便说一句)。

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);
    }
}
于 2013-11-13T23:05:03.990 回答