首页 文章

显示详细信息时出错(已放置ObjectContext实例)

提问于
浏览
3

我正在构建一个ASP.NET MVC 3应用程序,我有一个看起来像这样的模型:

public partial class Flavor
{
   // ...
   public string Name { get; set; }
   public bool HasNuts {get; set; }
   public virtual ICollection<SaleData> Sales {get; set;}
   // ...
}

它从db中检索一些数据:

public PartialViewResult Details(int id)
{
   using (var db = new IceCreamDBFlavors())
   {
      Flavor someFlavor = db.Flavors.Find(id);
      someFlavor.Sales = db.Sales.Where(c => c.FlavorID == id).ToList();
      return PartialView("details", someFlavor);      
   }
}

在视图上我做这样的事情:

<fieldset>
   <legend>Sales Data</legend>
   @foreach (var sale in Model.Sales)
   {
      <div>Weekly</div>
      <div>@sale.Weekly</div>
   }
</fieldset>

如果我没有检索销售数据,我的Flavor数据显示没有错误,但添加调用以检索销售数据列表会导致错误 "The ObjectContext instance has been disposed and can no longer be used for operations that require a connection." .

我已经阅读了其他一些关于此的帖子,并猜测我在这里遗漏了一些东西 . 我相信这个错误是由于延迟加载而发生的,至少基于我在这里和其他地方所读到的内容 . 我相信,在返回PartialView并检查对象之前在Controller中设置断点会导致评估发生,所以一切都显示为我想要的 .

我的印象是 ToList() 调用将强制Sales集合被填写 . 由于我没有注释掉,我认为问题仍然与此有关,当View试图迭代销售时,它可以'吨 . 我在这里纠正吗?我想我以为我正在强迫进行评估 . 我该如何解决这个问题?

2 回答

  • 0

    不要处置从ObjectContext继承的IceCreamDBFlavors类,它需要的生命周期大于当前允许的生命周期 .

    更改

    using (var db = new IceCreamDBFlavors())
    {
      Flavor someFlavor = db.Flavors.Find(id);
      someFlavor.Sales = db.Sales.Where(c => c.FlavorID == id).ToList();
      return PartialView("details", someFlavor);      
    }
    

    try
    {
        var db = new IceCreamDBFlavors();
    
        Flavor someFlavor = db.Flavors.Find(id);
        someFlavor.Sales = db.Sales.Where(c => c.FlavorID == id).ToList();
        return PartialView("details", someFlavor);    
    }
    catch(Exception ex)
    {
        // log exeption
    }
    
  • 2

    我怀疑 Flavor 有其他集合(而不仅仅是 Sales ),实际上它正在访问它破坏的那些集合 .

    在这里,您只替换Sales,而其他集合或复杂属性仍然需要对象上下文 .

相关问题