c# - 即使它是一个列表,也无法在处理后访问数据对象

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

我收到这个错误:

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/

相关文章:

c# - 如何从 Windows 应用程序写入控制台窗口?

c# - 如何直接针对 List<T> 进行验证?

c# - 如何在类型名称中明确指定程序集?

c# - MongoDB 和 C# 数据源

asp.net-mvc-3 - 如果 URL 有查询字符串,AuthorizeAttribute 不起作用?

asp.net-mvc-3 - ASP.Net MVC 3 ModelState.IsValid

c# - .NET MVC Razor 动态表单生成

c# - Silverlight 中的随机动画

c# - 如何以编程方式绑定(bind)到静态属性?

c# - 是否可以不指定工作表名称和列?