0

アプリごとに1つのDataContextだけを持ち、それをシングルトンで共有しても大丈夫でしょうか?

すべての形式でDataContextを使用したいので、これを尋ねますが、1つのDataContextでエンティティを変更した場合、以前に使用した場合はそれを更新する必要があることに気付きました。

例:form1:

db = GetContext()
item=(from p in db.Table where p.id=1 select p)

別のフォームで

db = GetContext()
item=(from p in db.Table where p.id=1 select p)
item.value="test"

元のフォームに戻る必要があります

db.Refresh(RefreshMode.OverwriteCurrentValues, item)

私が新しいことをしても

item=(from p in db.Table where p.id=1 select p)

(更新なし)値は更新されません

DataContextはスレッドセーフですか?

4

2 に答える 2

4

アプリごとに1つのDataContextだけを持ち、それをシングルトンで共有しても大丈夫でしょうか?

まあ、それは確かにそれが設計されたものではありません-そしてあなたが複数の操作を実行する複数のスレッドを持っていたなら、それは確かに良い考えではないでしょう。

データベース接続と同様に、必要なときにコンテキストを作成し、必要なことをすべて実行してから、実行する新しい一連の操作があるときに新しいコンテキストを作成するのが最善です。

于 2012-10-13T09:18:54.270 に答える
2

シングルトンとして使用する場合は問題があります。内部キャッシュを内部に持つUnitofWorkパターンを使用して実装されます。内部キャッシュの目的は、データベースへのラウンドトリップを回避し、変更を追跡することです。シングルトンのままにしておくと、内部キャッシュが増加し、当面はメモリリークが発生します。DataContextDataContextDataContext

ベストプラクティスは、DataContextの存続期間をスレッドごとにすることです。ほとんどのIoCコンテナはこれをサポートしており、1つを選択して使用するだけです。

DataContextはスレッドセーフではないため、おそらく静的コンストラクターを使用してアドセーフシングルトンを実装したか、Lazy<>

于 2012-10-13T09:24:05.097 に答える