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

时间:2011-12-24 00:19:49

标签: c# asp.net asp.net-mvc-3 razor

我收到此错误:

  

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

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

由于

2 个答案:

答案 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会发生什么?既然你把列表放到一个新的变量?