即使数据对象是列表,也不能在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中。
有人知道为什么会这样吗?它不应该被存储在内存中并工作吗?还是我需要明确地声明一些我想要保持关联的东西?
谢谢
问题是您正在查询数据库中的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会发生什么?因为你把列表放入一个新变量中?