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
、エンティティをそのままの状態で取得するかどうかは、設定に依存するように見えますデータベース内、または最後にローカルに持っていた状態だけです。