【问题标题】:Json.Encode(Model) throws "The ObjectContext instance has been disposed" exceptionJson.Encode(Model) 抛出“ObjectContext 实例已被释放”异常
【发布时间】:2014-02-15 11:05:35
【问题描述】:

我有一个简单的剃​​刀视图:

<script>var fieldList = @Html.Raw(Json.Encode(Model));</script>

这行抛出The ObjectContext instance has been disposed 异常。如果我删除它,即使我稍后在 View 中使用Model,它也能正常工作。

foreach (SomeCustomObject pField in Model)
{
    <div>
        @pField.SomeProperty
    </div>
} 

控制器动作

    ActionResult SomeAction()
{
    List<SomeCustomObject> tList = new List<SomeCustomObject>();
    using(EFEntities db = new EFEntities())
    {
        tList = db.SomeCustomObject.ToList();
    }
    return View(tList);
}

我推测,这可能是因为对象的导航属性不再起作用。是否可以告诉Json.Encode 只使用对象的非导航属性?

【问题讨论】:

  • 请提供您的控制器类的代码

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


【解决方案1】:

您不能在 using 块之外的模型对象上进行操作,该块是加载的。可能JSON.encode 对模型对象进行了深度反射分析,因此涉及到一些与上下文相关的属性。

所以,一般情况下,你应该在 controller/action 方法中将模型转换为 JSON,using中,将其放入字符串变量,然后使用它模板中的变量。

【讨论】:

  • 正如您所确认的那样 - 问题确实出在关系上,所以我使用了一些不同的方法 - 我希望它确实如此。
【解决方案2】:

我想出的最简单的方法是:

  1. 在数据库中创建视图 ViewSomeCustomObjects,返回 SomeCustomObjects 表的所有字段。
  2. 从数据库更新模型并包含新视图。
  3. 使用映射到视图而不是表的实体,因为这仅用于数据显示。
  4. 我真的希望如果我更改数据库中的 SomeCustomObjects 表,更改将级联到整个解决方案...

【讨论】:

    【解决方案3】:

    在开始从数据库中提取内容之前,首先使用 context.Configuration.LazyLoadingEnabled = false; 禁用上下文的延迟加载。

    using (var context = new SomeEntityContext())
    {
       context.Configuration.LazyLoadingEnabled = false; // This is the fixer.
       return context.SomeEntitiesWithRelations.ToList();
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-10-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多