我有以下 Linq to SQL 结构:我有“文章”和“用户”类。每篇文章都有一个卖家(即用户),每个用户都有许多文章。我通过协会解决了这个问题。
然后我有一个方法 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);
我认为的卖方的文章,但这也是不可能的,因为它会无穷无尽。
文章 -> 卖家 -> 文章 -> 每篇文章一个卖家 -> 文章 -> 再次卖家 -> ...
我得到了例外
LoadOptions LoadWith 类型图中不允许循环。
我想要的是一种获取所有具有正确关联对象的文章的方法,如我的第一个方法所示。关联对象应始终可访问,但仅在访问时从数据库加载。
如果我在程序中需要列表的任何地方都使用 DataContext,然后只在 DataContext 中使用列表,这将是可能的。但这将非常费力。
你们知道如何访问关联对象,而无需在我需要列表的程序的任何地方编写我的 Read() 方法的代码吗?