0

ASP.NET MVC でのオブジェクトのリストの保存について質問があります。まず、EntityFramework や ORM ツールのような Nh は使用していません。Ado.net を使用してください。

オブジェクト Product があり、javascript を介してすべての製品データを収集し、1 回の呼び出しで製品リストをバッチ更新するとします。

私の質問は、挿入、更新、または削除されたアイテムをいつ区別する必要があるかということです。

  1. 1 つの戦略は、DTO オブジェクトと javascript ViewModel に enum プロパティを設定し、viewModel にアイテムを追加するときに、このオブジェクトに追加するマークを付け、1 つのアイテムを変更した場合は、それを更新済みにマークすることです。そのため、このリクエストがアクションに来ると、挿入または更新するアイテムを知ることができます。

    • 長所: サーバー側では簡単です。オブジェクトのステータスをサーバー側と区別する必要はありません。
    • 短所:サードパーティによって呼び出されるwebapiにこのアクションを公開したい場合、オブジェクトの状態を区別するためにサードパーティのユーザーが必要になる場合があります。
  2. サーバー側からデータを区別します。オブジェクトのリストを提供してください。サーバー側では、まずデータベースから現在のデータを取得し、データを比較してから、挿入または更新するレコードを確認します。

    • 長所: すべての比較はサーバー側から行われます。
    • 短所:パフォーマンスの問題
  3. クライアントから渡されたデータが何であれ、現在のデータを削除して新しいデータを挿入するだけです

誰かが私にアドバイスをくれることを願っています.

4

2 に答える 2

1

追加/削除/変更された項目が JavaScript 配列に保持され、サーバーにポストバックされるオプション 1 を見てきました。しかし、何らかの理由で、状態を維持するためにクライアント側のコードを書いているためか、気に入らなかったのです。

そのため、2 番目のオプションを使用しました。LINQ のおかげで作業が簡単になりました。リストに一意の ID があると仮定すると、以下は疑似コードです。注: 新しく追加されたアイテムには一意のランダム ID が必要です。そうしないと、既存のアイテムとして扱われる可能性があります。私の場合はその GUID であるため、オーバーライドする可能性はありませんでした。

var submittedIds = vmList.Select(a=>a.Id).ToList();
var dbIds = dbList.Select(d=>d.Id).ToList();
//Added items
var newIds = submittedIds.Except(dbIds).ToList();
//loop over newIds and construct list object to contain newly added items 

//Deleted items
var deletedIds = dbIds.Except(submittedIds).ToList();
//Modified items
var modifiedIds = dbIds.Intersect(submittedIds).ToList();//if the values don't change, update statement won't do any harm here

このアプローチは、巨大なリストを扱っていない限り、妥当なパフォーマンスを提供します。

3番目のオプションは良くないと思います。例: テーブルに監査機能を実装する予定がある場合、間違った機能が提供されます。新しいレコードが挿入されると、すべてのレコードのエントリが削除されてから 1 つ挿入されますが、挿入されるのは 1 つだけであるため、間違っています。

于 2013-02-28T04:34:25.027 に答える
1

3 番目の戦略は単純な状況に適しています。たとえば、発注書の項目を更新したい場合など、注文に含まれる OrderLineItems が多すぎない場合などです。ただし、並行性の問題に注意する必要があります。

あなたの最初の戦略は、一般的なケースに最も適していると思います。実装も簡単です。サービスをサード パーティに公開する場合、通常、クライアントはサービスの定義と要件に従う必要があります。


アップデート

1 番目の戦略の場合: クライアントがデータのステータスを指定する必要がない場合は、指定してください。SaveOrder サービスをより小さなサービス (CreateOrder、UpdateOrder、DeleteOrder) に分けることができます。

于 2013-02-28T04:27:26.553 に答える