0

全て、

UI(Win Form Application)のフォームにエンティティオブジェクトのリストを渡して編集する方法(アルゴリズム)を考えようとしています(たとえば、グリッドでは-これには関係ありません-これは私が望む概念です確立する)。フォームは、FormEditという名前で、[OK]、[キャンセル]、[適用]ボタンがあります。

私のエンティティには、例として次の階層があります。

Class Entity1
   ...
   Entity2List As EntityCollection(Of Entity2)
   ...
End Class 

Class Entity2
    ...
    SomeValue As String   ' This would be a field in my entity mapping to the database
    ...

FormEditで編集したいEntity2Listです。

FormEditは、Entity2Listを渡すメインフォームからトリガーされます。メインフォームには、context.SaveChanges()を実行する[保存]ボタンがあります。メインフォームが初期読み込みを行います。

[OK]をクリックすると、変更が保持され、FormEditが閉じます。[適用]をクリックすると、変更が保持されます。[キャンセル]をクリックしたら、FormEditで行われた編集をすべて無視して閉じ、FormEditが読み込まれたときのEntity1.Entity2Listを初期状態にします([適用]をクリックした場合を除く-以下のシナリオを参照)。

これで、FormEditに何度もアクセスできるようになったため、行った変更はすべてそのフォームの範囲内にある必要があります。したがって、次の初期状態を前提として、次のことを行うとします。

Entity1には単一のレコード/行/オブジェクトがあります。Entity1.Entity2Listには、次の2つのレコード/行/オブジェクトが含まれています。

Record1:  SomeValue = 33
Record2:  SomeValue = 10

シナリオ1

  1. アプリケーションの開始-メインフォームにロードされたエンティティ。
  2. [編集]ボタンをクリックして、Entity1(Instance).Entity2Listをパラメーターとして受け取るFormEditの表示をトリガーします。
  3. グリッドに新しい行を追加します。これにより、Entity1.Entity2Listに行が追加されます。
  4. Record1を変更し、SomeValueを33から100に変更します。
  5. [キャンセル]をクリックします。これにより、Entity1.Entity2Listが初期状態に戻るはずです。

シナリオ2

  1. アプリケーションの開始-メインフォームにロードされたエンティティ。
  2. [編集]ボタンをクリックして、Entity1(Instance).Entity2Listをパラメーターとして受け取るFormEditの表示をトリガーします。
  3. Record1を変更し、SomeValueを33から100に変更します。
  4. [適用]をクリックします。
  5. Record1を変更し、SomeValueを100から-9に変更します。
  6. [キャンセル]をクリックします。これにより、手順5で行った変更が元に戻ります。手順3で行った変更は、[適用]をクリックしたときに記憶されます。

このような変更を追跡するための何らかのメカニズムが必要です。[OK /適用]をクリックすると、コンテキスト上のオブジェクトに変更が加えられます。

これを行うためのアプローチはありますか?すべてのアイデアや提案を歓迎します。

乾杯、

アンデス

4

1 に答える 1

1

最初のフォームのリストに表示される単一のエンティティのコレクションを編集するために2番目のフォームを開く場合は、FormEditに毎回新しいコンテキストを使用することを検討します。各エンティティのEntity2コレクションが最初のフォームで表示または操作されない場合、単一のコンテキストを使用することに利点はありません。実際、両方のフォームに単一のコンテキストを使用すると、コレクションに追加されるエンティティが増えるにつれてメモリ消費量が増加し、同時実行の問題が発生する可能性が高くなり、アプリケーションが不安定になります

2番目のコンテキストを使用すると、を呼び出すだけで変更をキャンセルするのが非常に簡単になりますcontext.Dispose()DbEntityEntryそれ以外の場合は、コンテキスト変更トラッカー内のすべてのオブジェクトをループして、CurrentValuesに戻しOriginalValues、追加した可能性のある新しいentity2オブジェクトを破棄し、削除されたentity2オブジェクトの状態を変更する必要があります。[適用]ボタンと[OK]ボタンはcontext.SaveChanges()、別のコンテキストで呼び出す必要があります。

両方のフォームでエンティティの状態を同期する必要がある場合は、エンティティを切り離して、作業中の関連するコンテキストに追加するか、form2が閉じた後にform1でエンティティをリロードするだけです。

于 2013-01-25T21:04:49.320 に答える