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 に設定しました。Seller をロードするには、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();
        }
    }

さて、それは今のところ機能しますが、1 つのレベルでのみです。これで article.Seller にアクセスできますが、そのセラーの他の記事 (article.Seller.Articles) を取得したい場合は null になります。出品者の商品を載せるだけoptions.LoadWith<User>(u => u.Articles);と思っていたのですが、それも無限にあるので無理です。

記事 -> 販売者 -> 記事 -> 各記事 a 販売者 -> 記事 -> 再び販売者 -> ...

私は例外を取得します

LoadOptions LoadWith タイプ グラフでは循環は許可されていません。

私が欲しいのは、最初の方法で示したように、正しい関連オブジェクトを持つすべての記事を取得する方法です。関連付けオブジェクトは常にアクセス可能である必要がありますが、アクセス時にのみデータベースからロードされます。

これは、プログラム内のリストが必要なすべての場所で DataContext を使用し、DataContext でのみリストを操作する場合に可能です。しかし、それは非常に面倒なことです。

リストが必要なプログラムのどこにでも Read() メソッドのコードを書かずに関連付けオブジェクトにアクセスする方法を知っていますか?

4

1 に答える 1

1

私も過去にこれに遭遇しました。Dispose()遅延読み込みを許可する場合は、呼び出しを行わないのが一般的な方法です。実際、電話をかけるDispose()必要はまったくありません。

Dispose()DataContextを呼び出すかどうかについては、かなり多くのことが書かれています。あなたはそれをふるいにかける必要がありますが、ここに素晴らしい記事があります. 基本的に、DataContext はその接続自体を管理するため、明示的に破棄する必要がある接続は実際にはありません。

于 2013-02-14T15:03:30.667 に答える