【问题标题】:"ObjectContext has been disposed" /multi-controller view“ObjectContext 已被处理”/多控制器视图
【发布时间】:2014-01-30 16:00:54
【问题描述】:
@foreach (Thing thing in Model) {
    @Html.Action("someAction", "someOtherController", thing)
    //kind of a PartialView but coming from another controller
}

-

public class someOtherController: Controller
{

    public PartialViewResult someAction(Thing Model)
    {
        ...
    }

当这个 Html.Action 被调用时,我得到 The ObjectContext instance has been disposed and can no longer be used for operations that require a connection.

这是一个我通常能够在代码中的适当位置使用.Include() 来修复的错误。

但在这种情况下:

  • 在调试时,它看起来不像“东西”或包含的子实体已被处置。
  • 我可以在@Html.Action("someAction", "someOtherController", thing) 上设置断点,但如果我在someAction(...) 方法的第一行设置断点,则永远无法到达。
  • 我有另一个页面使用这种局部视图,它运行良好
  • 如果我在@Html.Action("someAction", "someOtherController", thing) 的位置生成内容,而不是通过局部视图调用它,它可以完美运行。 -

所以该调用和控制器之间一定有问题,但我无法指出是什么。知道如何进一步调试和/或解决问题吗?


有人询问:

数据访问层:

public static List<Thing> GetAllThings(string[] Include = null)
{
    using (Entities ctx = new Entities())
    {
        if ((Include != null) && (Include.Length > 0))
        {
            System.Data.Entity.DbSet<Thing> things= ctx.Things;
            System.Data.Entity.Infrastructure.DbQuery<Thing> thingQuery= things.Include(Include[0]);
            for (int i = 1, c = Include.Length; i < c; i++)
                thingQuery= thingQuery.Include(Include[i]);
            return thingQuery.ToList();
        }
        return ctx.Things.ToList();
    }
}

在控制器中:

public ActionResult Index()
{
    string[] include = new string[] { "Stuff1.Stuff2", "Stuff4.Stuff5.Stuff6", "Stuff7.Stuff8" };
    List<Things> things = ThingsManager.GetAllThings(include).OrderBy(x => x.Name).ToList();
    return this.View(things);
}

【问题讨论】:

  • ObjectContext在哪里被打开和关闭?
  • 当它在调试中工作时,您的 ObjectContext 似乎是静态的。这是一种不好的做法。
  • 您需要提供更多信息才能获得答案。填充“items”的查询是什么,“someOtherController”中的“someAction”对“item”有什么作用?通常,您是正确的,因为您应该能够使用急切加载的“包含”语句来解决此问题。确认您正在加载所有将被枚举的相关实体。
  • @ivowiblo: 在主视图的控制器中
  • @ivowiblo:不,它不是静态的

标签: c# asp.net-mvc partial-views objectdisposedexception


【解决方案1】:

异常消息说明了一切:在尝试枚举延迟加载的相关实体之前,您的数据库上下文已超出范围。

检查以确保您正在急切加载此代码块操作的所有相关实体:

@foreach (item dto in items) {
    @Html.Action("someAction", "someOtherController", item) //kind of PartialView but coming from another controller

【讨论】:

  • 这是我已经检查过的。正如我在问题中提到的:“如果我在 @Html.Action("someAction", "someOtherController", item) 的位置生成内容,而不是通过部分视图调用它,它会完美运行。如果我在 cmets 中放置 Html.Action 调用之外的任何代码(空的部分视图等),我仍然会收到错误...
  • 是的,但这就是重点。当你将它传递给另一个控制器时,它会进行另一个服务器端调用,此时,产生“项目”的对象上下文将已经被释放。
  • 我不知道您是否在实体上利用部分类,但如果是,您还需要检查相关实体遍历的部分类。我经常因为不包括在部分类中遍历的相关实体而绊倒自己。
  • 我不确定我是否得到了我需要检查的内容,但是:所有类都是 Entity Frameworl 生成的,并且两个控制器都知道它们。
  • 好的,这有帮助。我注意到在 StackTrace 的某个地方:“[TargetInvocationException: 对象 '...thing...' 上的属性访问器 'someProperty' 引发了以下异常:'ObjectContext 实例 ...”。因此,我将提到的属性一一包括在内,甚至那些我没有用的属性,直到我不再有例外。我想我对另一个类做同样的事情没有遇到这个问题,因为我已经需要包含它的所有属性。否则会有一些我得不到的东西。
猜你喜欢
  • 2017-03-19
  • 2015-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多