1

我有以下 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() 方法的代码吗?

4

1 回答 1

1

我过去也遇到过这种情况。Dispose()一般的做法是,如果要允许延迟加载,则不要调用。事实上,调用Dispose()并不是真正需要的。

有很多关于是否调用Dispose()DataContext 的文章。您必须对其进行筛选,但这里有一篇不错的文章。基本上,因为 DataContext 自己管理它的连接,所以它实际上没有任何需要显式处理的连接。

于 2013-02-14T15:03:30.667 回答