关于Disposing DataContext和DataBind()

时间:2011-08-08 04:49:01

标签: c# .net linq linq-to-sql idisposable

所以,如果我有一些方法可以返回产品列表:

    public IEnumerable<Product> List()
    {
        try
        {
            using (MyDataContext db = new MyDataContext ())
            {
                return db.Products.ToList();
            }
        }
        catch (Exception ex)
        {
            throw new Exception(ex.Message, ex);
        }
    }

当我设置时,让我们说Repeater将其作为数据源:

protected void LoadList()
{
     BusProducts products = new BusProducts();
     rptProducts.DataSource = products.List();
     rptProducts.DataBind();
 }

我在DataBind()上收到错误,说我无法访问Disposed Object(MyDataContext)..

这是对的吗?即使我使用.ToList()返回所有内容?

1 个答案:

答案 0 :(得分:4)

如果由于绑定而引用任何Product实体的导航属性(相关的父或子实体),那么即使使用ToList,也会得到该异常。这是因为访问导航属性将需要在访问属性时对数据库进行额外查询。如果已经处理了DataContext,那将无效。

您可以通过在检索产品数据时急切加载相关数据来避免这种情况。这是使用预取机制--DataContext.LoadOptions,使用LoadWith选项完成的。

http://msdn.microsoft.com/en-us/library/Bb882681%28v=VS.90%29.aspx