【问题标题】:'The ObjectContext instance has been disposed' in Razor's Html.Raw()Razor 的 Html.Raw() 中的“ObjectContext 实例已被处理”
【发布时间】:2016-06-13 08:36:26
【问题描述】:

我正在尝试将我的模型转换为 JSON 字符串,因为我希望在此特定视图中使用 Knockout 绑定。​​

首先,我尝试将模型转换为 JSON 字符串,如下所示:

@{
    var serializerSettings = new Newtonsoft.Json.JsonSerializerSettings();
    serializerSettings.NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore;
    var jsonData = @Html.Raw(Newtonsoft.Json.JsonConvert.SerializerObject(Model, serializerSettings));
}

最后一行(实际转换),出现如下错误:

ObjectContext 实例已被释放,不能再用于需要连接的操作

我的控制器只是从数据库中获取对象,就像这样:

public ActionResult Partner(int id)
{
    using(var db = new DatabaseContext())
    {
        var partner = db.Partners
            .Include(x => x.OperatingCountries)
            .Include(x => x.Secrets)
            .FirstOrDefault(x => x.Id = id);

        return View(partner);
    }
}

我在另一个没有发生此错误的视图中执行了完全相同的操作。这是什么原因造成的,我该如何处理?

【问题讨论】:

  • Partner 是否包含任何作为集合或复杂对象的属性?
  • 是的。确切地说是其中两个; public virtual ICollection<Country>public virtual ICollection<Secret>
  • 您可能需要在查询中使用.Include() 来加载它们。
  • 对不起,我忘记了,但我已经有了包含。已编辑

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


【解决方案1】:

Entity Framework 中的实体对象不应用于序列化。当您将这些对象存储在分布式缓存中时,也会出现同样的问题。

如果您仍想使用 Entity 对象进行序列化,请禁用延迟加载。

context.Configuration.LazyLoadingEnabled = false;

【讨论】:

  • 所以基本上只是制作一个包含与 EF 对象相同数据的模型?
  • 创建单独的模型会起作用。避免延迟加载也将起作用。在查询之前,禁用延迟加载。如果延迟加载被禁用,则不需要包含,除非视图中需要该数据。
猜你喜欢
  • 2017-03-19
  • 2015-08-17
  • 2013-04-20
  • 2020-06-10
  • 2017-08-31
  • 1970-01-01
  • 1970-01-01
  • 2015-10-07
  • 1970-01-01
相关资源
最近更新 更多