我收到这个错误:
Cannot access a disposed object.
Object name: 'DataContext accessed after Dispose.'.
对于这段代码:
...
ViewData["AdSlots"] = dbc.AdSlots.Where(a => a.PublisherId == publisherId).ToList();
dbc.Dispose();
当我将此代码用于 View 时:
grid.Column(header: "Ad Size", style: "ad-size", format: @<text>@item.AdSize.Width x @item.AdSize.Height</text>),
顺便说一句,这是在 MVC3 中。
有人知道为什么会这样吗?它不应该存储在内存中并起作用,还是我需要明确说明我希望关联也保留的内容?
谢谢
最佳答案
问题是您在数据库中查询 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;
关于c# - 即使它是一个列表,也无法在处理后访问数据对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8621788/