我正在构建一个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时,它不能。我在这里纠正吗?我想我想我正在强迫进行评估。我该如何解决这个问题?
答案 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
}