我有以下Linq to SQL结构:我有“Article”和“User”类。每篇文章都有一个卖家(这是一个用户),每个用户都有很多文章。我通过协会解决了这个问题。
然后我有一个方法Read(),它获取所有文章并将其返回到列表中。
public static List<Article> Read()
{
using (DataContext dbx = new DataContext())
{
return dbx.Article.ToList();
}
}
所以,现在的问题是:当我在程序中的任何地方使用列表并且我想访问article.Seller时,我得到以下异常:
无法访问已处置的对象
好吧,这似乎是合法的,因为我返回列表,然后处理DataContext。如果我想访问卖家,它将从数据库加载,并且不再可能使用已处理的DataContext。
所以我通过延迟加载解决了这个问题,并将 DeferredLoadingEnabled 属性设置为false。 为了加载卖家,我使用了 DataLoadOptions 。
public static List<Article> Read()
{
using (DataContext dbx = new DataContext())
{
dbx.DeferredLoadingEnabled = false;
DataLoadOptions options = new DataLoadOptions();
options.LoadWith<Article>(a => a.Seller);
dbx.LoadOptions = options;
return dbx.Article.ToList();
}
}
好的,到目前为止一切正常,但仅限于一个级别。现在我可以访问article.Seller,但如果我想获得该卖家的其他文章(article.Seller.Articles),我会得到null。
只需加载卖方的文章options.LoadWith<User>(u => u.Articles);
我想,但这也是不可能的,因为它会无穷无尽。
文章 - &gt;卖家 - &gt;文章 - &gt;每一条卖方 - &gt;文章 - &gt;再次卖家 - &gt; ...
我得到了例外
LoadOptions LoadWith类型图中不允许循环。
我想要的是一种获取具有正确关联对象的所有文章的方法,如我的第一种方法所示。 应始终可以访问关联对象,但只能在访问时从数据库加载。
如果我在程序中需要列表的地方使用DataContext,然后只在DataContext中使用列表,那么这是可能的。 但那将是非常费力的。
你们有没有想过如何在我的程序中无需编写我的Read()方法的代码来访问关联对象我需要列表?
答案 0 :(得分:1)
我过去也遇到过这种情况。通常的做法是,如果要允许延迟加载,则不要调用Dispose()
。实际上,根本不需要调用Dispose()
。
关于是否在DataContext上调用Dispose()
,已经写了很多。你必须仔细研究它,但有一篇很好的文章here。基本上,因为DataContext本身管理它的连接,所以它实际上没有任何需要明确处理的连接。