データセットが善か悪かという別の議論を始めるつもりはありません。引き続き使用する場合は、次の点を考慮してください。
- 正しい挿入と更新を行うには、元のデータセットを保持して更新する必要があります。
- あなたは両親に子供たちのことを知ってもらいたいと思っていますが、その逆は望んでいません。ParentTable を追放します。
- Order とその OrderDetails は (ドメイン駆動設計による) 集約であり、全体として考慮する必要があります。order.Save() を呼び出すと、すべてが保存されます。
まあ、それが理論です。どうすればそれができますか?1 つの方法は、次のアーティファクトを作成することです。
OrderMap は、Order to Dataset の関係を管理する場所です。内部的には、Hashtable または Dictionary を使用できます。
OrderRepository は、注文を取得する場所です。リポジトリは、どこかからすべての関係を含むデータセットを取得し、すべての OrderDetails を使用して注文を構築し、注文/データセットの関係を OrderMap に格納します。
OrderMap は、Order が存続している限り存続する必要があります。Order にはすべての OrderDetails が含まれます。
注文をリポジトリに渡し、保存します。リポジトリはマップからデータセットを取得し、注文から注文テーブルを更新し、すべての注文詳細を繰り返し処理して OrderDetail テーブルを更新します。
取得して保存します。
var order = repository.GetOrder(id);
repository.Save(order);
OrderRepository.GetOrder() の内部:
var ds = db.GetOrderAndDetailsBy(id);
var order = new Order();
UpdateOrder(ds, order);
UpdateOrderDetails(ds, order); // creates and updates OrderDetail, add it to order.
map.Register(ds, order);
OrderRepository.Save() の内部:
var ds = map.GetDataSetFor(order);
UpdateFromOrder(ds, order);
foreach(var detail in order.Details) UpdateFromDetail(ds.OrderDetail, detail);
いくつかの最終的なメモ:
- マップをシングルトンとして実装できます。
- マップで弱参照を使用します。次に、必要なときに任意の注文をガベージ コレクションする必要があり、メモリが解放されます。
- OrderDetail をそのテーブル行に関連付ける方法が必要です
- .NET 3.5 にアップグレードする可能性が少しでもある場合は、アップグレードしてください。Linq to Sql または Linq to Entity は、あなたの苦痛の一部を取り除きます。
- これらはすべて、何もないところから作られています。不正確すぎないことを願っています。