3

DataServiceContext インスタンスをどのように使用するかについての標準的な慣行は何なのか疑問に思っています。コンテキストで操作を実行する必要がある複数のメソッドを持つクラスがある場合、各メソッド内にコンテキストの新しいインスタンスを作成するか、コンテキストをすべてのメソッドで共有されるクラスの単一メンバーにする必要があります?

私が取り組んでいるコードで、別の開発者が作成したコメントを最近見たので、これを尋ねています。これは、いくつかのオブジェクトを追加した後、さらに操作を実行する前にコンテキストを再作成する必要があることを述べています。

つまり、これを行う必要があります:

public class ServiceHelper
{
  public void DoSomething()
  {
    DataContext ctx = new DataContext(Uri);

    //do something with the context and call SaveChanges()
  }

  public int GetSometing()
  {
    DataContext ctx = new DataContext(Uri);

    return ctx.GetSomething();
   }
}

またはこれ:

public class ServiceHelper
{
  private readonly DataContext _ctx = new DataContext(Uri);

  public void DoSomething()
  {
    //do something with _ctx and call SaveChanges()
  }

  public int GetSomething()
  {
    return _ctx.GetSomething();
  }
}

?

また、これは ASP.NET MVC アプリケーションのコンテキストにあることを付け加えておく必要があるため、ここでの ServiceHelper クラスはページ要求ごとに再構築されます。

編集

これらは短命のクラスであるため、Msft によればどちらも技術的に有効であるように思われますが、どちらも等しく「安全」で同等であるかどうかはまだ疑問です。つまり、いくつかのエンティティを追加/更新して SaveChanges を呼び出すと、別のアプリケーションが同じエンティティを更新する可能性があり、同じコンテキスト インスタンスを使用してそれらのエンティティを再度取得すると、すべてが代わりに作成した場合と同じように動作します。 2 回目の操作の前に新しいコンテキストが必要ですか?

結論

私はこれを見つけたばかりで、違いを説明するのに役立つと思います:

デフォルトでは、クライアントは、DataServiceContext によってまだ追跡されていないエンティティのオブジェクトへの応答フィードのエントリのみを実体化します。つまり、すでにキャッシュにあるオブジェクトへの変更は上書きされません。この動作は、クエリおよび読み込み操作の MergeOption 値を指定することによって制御されます。このオプションは、DataServiceContext で MergeOption プロパティを設定することによって指定されます。デフォルトのマージ オプション値は AppendOnly です。これは、まだ追跡されていないエンティティのオブジェクトのみを具体化します。つまり、既存のオブジェクトは上書きされません。クライアント上のオブジェクトへの変更がデータ サービスからの更新によって上書きされないようにするもう 1 つの方法は、PreserveChanges を指定することです。OverwriteChanges を指定すると、

したがって、いくつかのエンティティを更新し、別のアプリケーションがさらに変更を加えてから、同じ DataServiceContext インスタンスを使用してそれらのエンティティを再度取得した場合MergeOption、エンティティをそのままの状態で取得するかどうかは、設定​​に依存するように見えますデータベース内、または最後にローカルに持っていた状態だけです。

4

1 に答える 1

3

MSDNはそれを言う

一般に、DataContext インスタンスは 1 つの「作業単位」の間存続するように設計されていますが、アプリケーションではその用語を定義しています。DataContext は軽量で、作成に費用がかかりません。一般的な LINQ to SQL アプリケーションは、メソッド スコープで、または関連するデータベース操作の論理セットを表す有効期間が短いクラスのメンバーとして、DataContext インスタンスを作成します。

もちろん、LINQ to SQL を使用します。しかし、他のテクノロジー/ライブラリのコンテキストでも、通常は非常に軽量なオブジェクトです。ほとんどの場合、物理接続は切断されません (ただし、論理接続は切断されます)。あなたの懸念は接続プーリングに関係していると思います.1つを使用している限り(そうすべきです)、msdnの推奨に従ってください。そう

public void DoSomething()
{
    using(DataContext ctx = new DataContext(Uri))
    {
         //do something with the context and call SaveChanges()
    }
}
于 2014-05-02T15:24:21.917 に答える