0

店員が情報を編集できるようにする Web アプリケーションがあります。ユーザーが変更をキャンセルする場合に備えて、編集が開始される前にエンティティをコピーします。問題は、コピーに加えられた変更が元のオブジェクトに適用されることです。

C# では、その問題を回避するためにディープ コピーを作成しますが、このアプリケーションは Entity Framework を使用しています... エンティティのディープ コピーを行う方法がわかりません。


ここに私の問題の詳細があります...私はまだ解決しようとしています。

インベントリ アイテムのリストにグリッドがバインドされた xaml 画面があります。項目は EntitySet です。ユーザーにアイテムの 1 つを編集してもらいたい場合は、現在のエンティティの値を同じタイプのオブジェクト「EntityToEdit」にコピーします。ユーザーが変更を加えて保存すると、リストが変更内容で自動的に更新されます。

この問題は、ユーザーが編集する別のアイテムを選択したときに発生します。その 2 番目の項目は、最初の項目に加えられた変更によって何らかの形で変更されています....

どうすれば「リンク」を解除できますか?!?

4

1 に答える 1

0

あなたの質問にはたくさんのことが起こっています。どこから始めればいいのかほとんどわかりません。

まず、エンティティを UI に直接バインドすることはお勧めしません。代わりに、データベースとアプリケーションのプレゼンテーション レイヤーの間に何らかの形の抽象化を使用することをお勧めします。

ほとんどの場合、作業している技術環境に応じて、使用できる確立されたベスト プラクティス パターンがいくつかあります。MVC パターン ( Model-View-Controller ) またはMVVM (Model-View-ViewModel) をご覧ください。 .

ディープ コピーに関しては、考えられる解決策がたくさんあります。「.Net でオブジェクトをディープ コピーするにはどうすればよいですか?」、オブジェクトが Stream にシリアル化されます。私もこの種のディープコピーを使用していましたが、これを避けようとしています。ディープ コピーが本当に必要なケースは非常にまれです。

[IEditableObject][4]また、編集するオブジェクトにインターフェイスを実装することも検討する必要があります。これにより、編集した値がいつ、どのようにコミットされるかを簡単に構造化し、オプションで、またはBeginEdit()EndEdit()、 などの単純なメソッドを実装して編集をキャンセルまたはリセットできますCancelEdit()。このインターフェイスをすぐにサポートし、オブジェクトに存在する場合はこれらのインターフェイス メソッドを自動的に呼び出す .NET コントロールもあります。

実装することによりIEditableObject、値がどのオブジェクトにコミットされるかを完全に制御できます。これにより、元のオブジェクトが誤って変更されるのを防ぐことができます。

于 2013-11-13T14:06:08.843 に答える