处理后即使其列表也无法访问数据对象

Dar*_*ren 1 c# asp.net razor asp.net-mvc-3

我收到此错误:

无法访问已处置的对象.
对象名:'Dispose后访问的DataContext.'.

对于此代码:

...
ViewData["AdSlots"] = dbc.AdSlots.Where(a => a.PublisherId == publisherId).ToList();
dbc.Dispose();
Run Code Online (Sandbox Code Playgroud)

当我将此代码用于视图时:

grid.Column(header: "Ad Size", style: "ad-size", format: @<text>@item.AdSize.Width x @item.AdSize.Height</text>),
Run Code Online (Sandbox Code Playgroud)

这是MVC3 btw.

有谁知道为什么会这样?它不应该存储在内存中并且有效吗?或者我是否需要明确说明我希望关联保存的内容?

谢谢

epi*_*isx 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;
Run Code Online (Sandbox Code Playgroud)