即使数据对象是列表,也不能在dispose后访问它

本文关键字:dispose 访问 也不能 数据 对象 列表 | 更新日期: 2023-09-27 18:18:53

我得到这个错误:

无法访问已处置的对象。
对象名称:'在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中。

有人知道为什么会这样吗?它不应该被存储在内存中并工作吗?还是我需要明确地声明一些我想要保持关联的东西?

谢谢

即使数据对象是列表,也不能在dispose后访问它

问题是您正在查询数据库中的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;

所以现在我想知道如果您留下与epignosisx发布的相同的代码但删除loadoptions会发生什么?因为你把列表放入一个新变量中?