1

本質的に、これはこの質問のフォローアップです。アイデア全体をあきらめるべきだと感じ始めていますが、もう一度試してみます。

私が欲しいのは、DB トランザクションにかなり似ています。DBへの変更を追跡し、最終的にそれらをコミットまたはロールバックできるようにする必要があります。オブジェクトを挿入すると、次の (適切な) SELECT クエリでそれを取得する必要があります。削除すると、今後の SELECT クエリで返されなくなります。等。

ただし、問題が 1 つあります。このトランザクションは非常に長時間実行されます。ユーザーがフォームを開いたときに開始され(ここではWindowsフォームについて話している)、コミット/ロールバックはユーザーがフォームを閉じたときに(OK/キャンセルで)開始されます。したがって、数秒から数日かかる可能性があります。この要件により、標準の DB トランザクションは除外されます。これは、トランザクションが触れたテーブル/行がロックされ、他のユーザーがシステムを使用できなくなるためです。また、トランザクションは、実際にコミットされるまで、DB への変更をコミットしないでください。そのため、1 人のユーザーが何らかの変更を行った場合、他のユーザーには [OK] ボタンが押されるまで変更内容が表示されません。これにより、コンピューターがクラッシュしたり、ネットワークから切断されたりした場合のエラーを防ぎます。

ソリューションがモデルに制約を課す場合、私はまったく問題ありません (私は MSSQL 2008 を使用しています)。DB/コードは好きなように設計できます。また、私のトランザクションが触れたオブジェクトの 1 つを誰かが既に変更しているために、コミットが失敗する可能性があるという考えにも問題はありません。

このようなことはありますか?私は NHibernate.Burrow を見ましたが、それが私が望むものかどうかはわかりません。

追加:これはプロジェクトのまさに始まりなので、私は NHibernate に縛られていません。私はそれで始めましたが、私はまだ簡単に変えることができます.

4

5 に答える 5

3

私が判断できる限り、DataObjects.NetはDisconnectedStateを介してこの概念を正確にサポートしています。この機能は非常に新しく(ほんの数週間前にリリースされました)、その予備的なドキュメントはここにあります。DataObjects.NetのWPFサンプルは、UIトランザクションに使用します。

そこに記載されているかどうかはわかりませんが、DisconnectedStateとそのOperationLogはシリアル化できます。そのため、キャッシュされた状態は、アプリケーションの再起動後も存続できます。

于 2010-03-17T00:50:11.007 に答える
1

誰も使用しないので、NHibernate コアにこれを実装する人はいないと思います。ビューモデルはドメイン モデルと同じモデルではありません。

于 2010-03-16T22:13:00.723 に答える
0

これはあなたの質問に対する直接的な回答ではありませんが、これは WWF (名前が大好きです) が解決しようとしていたようなものです (少なくとも v 3.5 までに解決したわけではありません)。

于 2010-03-16T22:00:44.650 に答える
0

まだこれに従っている場合は、Ayende Rahien が MSDN マガジンhttp://msdn.microsoft.com/en-us/magazine/ee819139.aspxにフォーム/プレゼンター アプローチごとのセッションに関する記事を掲載しています。トランザクションと会話に関するNHibernate ブックhttp://manning.com/kuate/ (サンプルの章が利用可能) の第 5 章も参照してください。

OKボタンが押されるまでフラッシュ/トランザクションを遅らせる限り、それは機能するはずです(フラッシュモードによって異なります)。ただし、複数のエンティティを処理するときに、セッションが他のセッションによってコミットされたデータにアクセスできるため、完全な分離は困難です。このような問題への対処を考える必要があります。

余談ですが、NHibernate を使用しない場合、この状況にどのように対処しますか?

于 2010-04-12T20:27:52.407 に答える
0

EclipseLink では、このような野獣に対するサポートが制限されています。彼らはそれを「適合」と呼び、「作業単位」のコンテキストで実装しました。

于 2012-05-17T18:12:43.393 に答える