0

私はまだ LINQ に不慣れで、DataContext をクラスのどこに配置するかを知る上でいくつかの問題を抱えています。

これが私が試したことです:

public class Student
{
    private static LinqClassesDataContext db = new LinqClassesDataContext();
    public static Profile GetProfile(int uID)
    {
        var profile = (from p in db.Profiles
                        where p.uID == uID
                        select p).FirstOrDefault();
        return profile;
    }
}

しかし、結果のキャッシュ (?) に問題があります - この問題を参照してください: ASP.net/Linq での奇妙なキャッシュの問題

次に、クラスの各メソッドに DataContext を入れてみました。

public class Student 
{
    public static Profile GetProfile(int uID)
    {
        using (LinqClassesDataContext db = new LinqClassesDataContext())
        {
            var profile = (from p in db.Profiles
                           where p.uID == uID
                           select p).FirstOrDefault();
            return profile;
        }
     }
}

しかし、アプリケーションで「Dispose 後に DataContext にアクセスしました」というエラーが発生しました。

したがって、これが行われるのを見た他の唯一の方法は次の方法です。

public class Student 
{
    public static Profile GetProfile(int uID)
    {
        LinqClassesDataContext db = new LinqClassesDataContext();
        {
            var profile = (from p in db.Profiles
                           where p.uID == uID
                           select p).FirstOrDefault();
            return profile;
        }
     }
}

しかし、これは最も効率的な方法ではないようです。おそらく私はLinqを間違って使用しています(私はASP.net'erを独学しています)が、前進するための最良の方法について教えてもらえますか?

4

1 に答える 1

1

オブジェクトはコンテキストに関連付けられているため、破棄するとすぐにその関係をナビゲートしようとすると、オプション 2 で得たのと同様に、この種のエラーが発生します。

ASP.NET はステートレスであるため、必要なたびにプロファイル オブジェクトをロードし、オブジェクトを静的にキャッシュしないようにするか、LINQ to SQL の DataLoadOptions オブジェクトを使用してオブジェクトとそれに関連するすべてのデータをロードする必要があります (これを参照)。そうすれば、関連するデータ セットにアクセスするときにコンテキストは必要ありません。

どこに置くかについては、私は常にHttpContext.Current.Itemsリクエストごとにインスタンスを保存できるコレクションに入れ、ここからすべてのリクエストで共有します。アプリケーションがここから取得していることをアプリケーションが認識しないように、いくつかのコードをラップします。ただし、ASP.NET の外部のプロセスが同じコードを使用する場合、HTTP コンテキストがないため、このアプローチは失敗するため、注意が必要です。その場合は、毎回コンテキストをインスタンス化してください。

于 2013-01-28T19:30:39.540 に答える