将Linq返回到列表中的SQL关联对象

时间:2013-02-14 13:51:55

标签: c# linq-to-sql

我有以下Linq to SQL结构:我有“Article”和“User”类。每篇文章都有一个卖家(这是一个用户),每个用户都有很多文章。我通过协会解决了这个问题。

enter image description here

然后我有一个方法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()方法的代码来访问关联对象我需要列表?

1 个答案:

答案 0 :(得分:1)

我过去也遇到过这种情况。通常的做法是,如果要允许延迟加载,则不要调用Dispose()。实际上,根本不需要调用Dispose()

关于是否在DataContext上调用Dispose(),已经写了很多。你必须仔细研究它,但有一篇很好的文章here。基本上,因为DataContext本身管理它的连接,所以它实际上没有任何需要明确处理的连接。