我收到此错误:
无法访问已处置的对象 对象名:'Dispose后访问的DataContext。'。
对于此代码:
...
ViewData["AdSlots"] = dbc.AdSlots.Where(a => a.PublisherId == publisherId).ToList();
dbc.Dispose();
当我将此代码用于视图时:
grid.Column(header: "Ad Size", style: "ad-size", format: @<text>@item.AdSize.Width x @item.AdSize.Height</text>),
这是MVC3 btw。
有谁知道为什么会这样?它不应该存储在内存中并且有效吗?或者我是否需要明确说明我希望保持关联的内容?
由于
答案 0 :(得分:5)
问题是您正在查询数据库中的 AdSolts 并立即处理它。然后在您的视图中,您的代码尝试访问尝试再次访问数据库的 AdSize ,但由于Linq-to-SQL的延迟加载特性,AdSize第一次没有加载,因为数据上下文处置,它抛出异常。
您可以使用 DataLoadOptions 来解决您的问题。
List<AdSlot> list;
using(var dbc = new DbDataContext())
{
var loadOptions = new DataLoadOptions();
loadOptions.LoadWith<AdSlot>(n => n.AdSize);
dbc.LoadOptions = loadOptions;
list = dbc.AdSlots.Where(a => a.PublisherId == publisherId).ToList();
}
ViewData["AdSlots"] = list;
答案 1 :(得分:1)
所以现在我想知道如果你保留epignosisx发布的相同代码但是删除loadoptions会发生什么?既然你把列表放到一个新的变量?