8

私が遭遇した Web アプリケーションでは、LinqToSQL を処理するときに DataContext を処理する次のコードを見つけました。

public partial class DbDataContext
  {
    public static DbDataContext DB
    {
      get
      {
        if (HttpContext.Current.Items["DB"] == null)
          HttpContext.Current.Items["DB"] = new DbDataContext();
        return (DbDataContext)HttpContext.Current.Items["DB"];
      }
    }
  }

次に、後でこれを参照してください:

DbDataContext.DB.Accounts.Single(a => a.accountId == accountId).guid = newGuid;
DbDataContext.DB.SubmitChanges();

LinqToSQL を扱う際のベスト プラクティスを調べてきました。

DataContext が ThreadSafe ではなく、その静的コピーを保持している場合に、これが取ったアプローチについてはわかりません。

これは、Web アプリケーションを取り入れるのに適したアプローチですか?

@ Longhorn213 - あなたが言ったことと、そのために HttpContext を読んだことに基づいて、あなたは正しいと思います。しかし、私が継承したアプリケーションでは、各メソッドの開始時にデータベースを再クエリして情報を取得し、データコンテキストのそのインスタンスを変更して変更を送信しているため、これは混乱しています。

このことから、データコンテキストが静的であり、リクエスト間で持続するという誤った印象を与えているため、このメソッドはお勧めできません。将来の開発者が、データが既に存在すると考えているためにメソッドの先頭でデータを再クエリすると考えた場合、問題が発生し、その理由がわからなくなる可能性があります。

だから私の質問は、この方法は将来の開発で思いとどまるべきですか?

4

5 に答える 5

6

これは静的コピーではありません。プロパティは、リクエストごとに Context.Items から取得することに注意してください。これは、静的プロパティを介してアクセスされる DataContext の要求ごとのコピーです。

一方、このプロパティは、リクエストごとに 1 つのスレッドのみを想定しており、これが永遠に当てはまるとは限りません。

于 2009-06-02T17:45:07.340 に答える
0

また、コンテキスト自体はトランザクションではないため、理論的には別のリクエストで更新が発生し、更新が失敗する可能性があります。

于 2009-06-02T17:52:47.453 に答える
0

私は Page 基本クラス (System.Web.UI.Page から継承) を作成し、DataContext プロパティを公開することを好みます。これにより、ページ要求ごとに DataContext のインスタンスが 1 つ存在することが保証されます。

これは私にとってはうまくいきました。バランスが取れています。ページの最後で DataContext.SubmitChanges() を呼び出すだけで、すべてが更新されます。また、すべての変更が一度に 1 人のユーザーに対して行われるようにします。

静的にこれを行うと痛みが生じます.DataContextは多くのユーザーの変更を同時に追跡しようとしているため、変更を追跡できなくなるのではないかと心配しています. そのために設計されたものではないと思います。

于 2009-06-02T22:22:49.343 に答える
0

ADataContextは安価に作成でき、この方法でキャッシュしてもあまりメリットはありません。

于 2009-06-02T17:44:54.423 に答える
0

私は多くの Linq to Sql Web アプリを実行しましたが、あなたが持っているものがうまくいくかどうかはわかりません。

データコンテキストは、オブジェクトに加えた変更を追跡することになっていますが、このインスタンスではそれを行いません。

したがって、変更を送信すると、オブジェクトが更新されたことがわからないため、データベースは更新されません。

Web アプリケーションのような切断された環境では、datacontext を使用して追加の作業を行う必要があります。アップデートで最も難しいですが、それほど悪くはありません。キャッシュせずに再作成するだけです。

于 2009-06-02T17:46:55.560 に答える