0

私は 2 層の WPF/EF Code First アプリケーションに取り組んでいます。私はたくさんのグーグルをしましたが、探していたもののサンプル実装を見つけることができませんでした...このフォーラムの誰かが私を助けてくれることを望んでいました. 要件は次のとおりです。

  • アプリ起動時
    1. DBContext を開く
    2. アプリケーションの起動時に、さまざまなマップ/リストに参照データをキャッシュします
    3. コンテキストを閉じます。
  • ユーザーがフォームを開いたとき
    1. DBContext を開きます (ここでは UnitOfWork パターンを使用しています)
    2. 編集のためにコンテキストからエンティティの新しいコピーを取得します。
    3. [保存] ボタンが押されたときに SaveChanges() を呼び出します。
    4. コンテキストを閉じます。

Cache のオブジェクトを使用してナビゲーション プロパティを変更すると、問題が発生します。たとえば、ドロップ ダウン (別の DBContext を使用して作成されたキャッシュに基づく) を使用して、Department ナビゲーション プロパティを設定します。

UnitOfWork は、エンティティが別の DBContext にロードされたことを示す例外をスローするか (Department が遅延ロードされた DynamicProxy の場合)、Department テーブルに新しい行を挿入します。

参照データがキャッシュされている例を 1 つも見つけることができませんでした...誰もこの問題に遭遇しなかったとは信じられません。適切な場所を探していないか、適切なキーワードを使用していません。これがEFを使用して実行できることを願っています。あなたの経験を共有したり、いくつかの参考文献を投稿したりしていただければ幸いです。私はこれに慣れていないので、あまりにも多くのフレームワークを使用することを避け、WPF/EF スタックを使用した POCO に固執したいと考えています。

4

3 に答える 3

1

キャッシュされたアイテムをアタッチしてみてください(おそらく、アタッチする前にクローンを作成します):

var existingUnicorn = GetMyExistingUnicorn();
using (var context = new UnicornsContext())
{
    context.Unicorns.Attach(existingUnicorn);
    context.SaveChanges();
}

DbContextの使用...の記事を参照してください。

于 2012-05-11T06:36:30.893 に答える
0

これには WPF を使用しているとのことですが、その場合、ドメイン層と対話するたびに新しい DBContext を開く必要はありません。(これがあなたが熱心に使用しているUoWに反する場合はお詫びします)

個人的には、デスクトップ アプリケーションにコード ファースト開発を使用してきましたが、コンテキスト (したがって接続) をプールすることでこの問題が回避され、これまでのところ問題が発生していないことがわかりました。

原則として、アプリケーションが起動されるとすぐに、メインの Context オブジェクトがメイン UI スレッド用に開かれ、アプリケーションの存続期間中ずっと開いたままになります。これは静的に格納され、使用時に任意の Repository クラスによって取得されます。

マルチスレッドのシナリオでは、バックグラウンド スレッドは自由に追加のコンテキストを開き、それらをリポジトリで使用して競合状態を回避できます。

このアプローチを採用すると、すべてのリポジトリが同じコンテキストを共有するため、オブジェクト コンテキストの追跡に起因する問題が発生しないことがわかります。

于 2012-05-11T07:23:07.357 に答える
0

ナビゲーションに加えて、 int 外部キー プロパティを定義することになりました。私のアプリケーションでは、int プロパティのみを変更し、ナビゲーション プロパティを使用して詳細を表示します (読み取り専用コントロール)。これは機能しますが、アプリケーションが少し脆弱になり、一貫性がなくなることもあります。

このブログでは、FK と Navi のプロパティが EF によって同期されていると主張していますが、動作させることができませんでした。

http://coding.abel.nu/2012/03/ef-code-first-navigation-properties-and-foreign-keys

于 2012-05-12T12:46:10.947 に答える