Json.Encode(Model)抛出“ObjectContext实例已被处置”异常

时间:2014-02-15 11:05:35

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

我有一个简单的剃​​刀观点:

<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仅使用对象的非导航属性?

3 个答案:

答案 0 :(得分:1)

您无法对加载它的using块之外的模型对象进行操作。可能JSON.encode对模型对象进行深度反射分析,因此触及一些与上下文相关的属性。

因此,在常见情况下,您应该在控制器/操作方法中将模型转换为JSON,在using块中,将其转换为字符串变量然后在模板中使用此变量。

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

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

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