0

データコンテキストの推奨される寿命について読んでいますが、それでも最良のオプションについては疑問があります。

一般に、私が見ている結論は、デスクトップアプリケーションでは、データコンテキストの存続期間はフォームの存続期間であり、WCFアプリケーションでは、存続期間はセッションの存続期間である必要があるということです。

その理由は、私が理解しているのは、データコンテキストの寿命は、コンテキストの作業単位の利点を得るのに十分な長さである必要がありますが、その利点を失うほど大きくはないからです。

ただし、たとえば、データベースからデータを読み取り、データコンテキストがデスクトップアプリケーションのフォームのプロパティとして作成されている場合、変更を行うと、データコンテキストのエンティティの値を変更するだけで済みます。 savechanges()メソッドを呼び出し、EFがデータコンテキストに変更を保存します。したがって、データベースとのやり取りは2つあり、1つはデータを取得するためのもので、もう1つは変更を保存するためのものです。

ただし、このようにすると、データコンテキストが非常に大きくなる可能性があり、同時実行の問題が発生する可能性も高くなります。つまり、データを読み込んで変更を加えて保存するため、他のユーザーが情報を変更する時間があります。

操作ごとにデータコンテキストを使用する場合は、disposeのデータコンテキストでデータを読み取り、ローカル変数の情報に変更を加えてから、変更を保存するときに、他のデータコンテキストを使用する必要があります。エンティティの場合、ローカル変数からエンティティに情報を渡すためにエンティティを検索してから、変更を保存する必要があります。

この場合、データベースとのやり取りが3つあるため、効率が低下し、データベースはより多くの作業を行う必要があります。1つは結果を取得してローカル変数に情報を渡すためのもので、もう1つは結果を再度取得してローカル変数からコンテキストに情報を渡し、最後に変更を保存するためのものです。また、ローカル変数から新しいコンテキストに変更を渡すために、2番目のデータコンテキストでエンティティを検索するために追加の作業を行う必要があります。

ただし、2番目のデータコンテキストでのデータのロードとローカル変数からコンテキストへの変更の受け渡しの間に経過した時間のみであるため、同時発生の問題が発生する可能性は低くなります。

では、デスクトップアプリケーションとWCFアプリケーションで、データコンテキストを操作するのに最適なオプションはどれですか?おそらく私はデータコンテキストの間違った使用をしていますか?

おそらく、2番目のアプローチを使用し、ローカル変数もエンティティである場合、2番目のデータコンテキストを作成できます。データベースからエンティティを読み込む代わりに、ローカルエンティティを直接追加し、状態を変更して追加、変更、または削除できます。そして、データコンテキストは変更を保存できますか?

4

1 に答える 1

6

では、デスクトップ アプリケーションと WCF アプリケーションで、データ コンテキストを操作するのに最適なオプションはどれでしょうか?

それは具体的な状況に依存しますが、ほとんどの場合、これはまさにあなたが必要とするものです:

  • WinForm / WPF - フォームごと / プレゼンターごとなど
  • WCF - サービス呼び出しごと。セッションごとまたはアプリケーションごとに決して行わない
  • ASP.NET - リクエストごと。セッションごとまたはアプリケーションごとに決して行わない

このような場合、言及された各スコープは通常、1 つの作業単位です。スコープ内に複数の作業単位がある場合は、異なるコンテキストのインスタンス化が必要になる場合があります。

最も困難な状況は、作業単位を手動で識別し、適切なコンテキスト ライフタイムを使用する必要があるマルチスレッド Windows サービスです。スレッド間でコンテキストを共有しないでください。複数の作業単位をサーバー化するために使用されるグローバルな長寿命コンテキストの使用は避けてください。コンテキストを共有することが間違った考えである理由の関連説明を次に示します。

ただし、同時実行の問題が発生する可能性は低くなります。これは、2 番目のデータ コンテキストにデータがロードされてからローカル変数からコンテキストに変更が渡されるまでの時間だけであるためです。

それは並行性の問題の誤解です。オプティミスティック コンカレンシーは、別のスレッド/ユーザーによって行われた変更を上書きしていないことを確認する必要があります。したがって、変更前にロードされた元のデータを使用して作業する必要があります。これは、変更前に知っていた最後の状態であるためです。データベースの同時実行の問題で最後の状態が現在の状態と一致しない場合は、解決する必要があります。これをサポートするには、提案されたソリューションを変更する必要があります。たとえば、更新のためにデータベースからデータをロードする場合、すべてのエンティティを調べて、現在のタイムスタンプが最初のデータ取得でデータベースからロードされたタイムスタンプと等しいことを確認する必要があります。

于 2012-04-15T09:09:17.650 に答える