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

时间:2011-05-11 16:09:30

标签: asp.net asp.net-mvc asp.net-mvc-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数据显示没有错误,但添加调用以检索销售数据列表会导致错误“ObjectContext实例已被处理,不能再用于需要连接的操作。“发生。

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

我的印象是ToList()调用会强制填写Sales集合。因为当该行被注释掉时我没有问题,我认为问题仍然与此相关,当View试图迭代Sales时,它不能。我在这里纠正吗?我想我我正在强迫进行评估。我该如何解决这个问题?

2 个答案:

答案 0 :(得分:2)

我怀疑Flavor有其他集合(而不仅仅是Sales),实际上在访问它时它已经破坏了。

此处您只替换Sales,而其他集合或复杂属性仍需要对象上下文。

答案 1 :(得分: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
}