1

いくつかの関連オブジェクトを含む中間層と、いくつかの DataTable およびリレーションシップを持つ DataSet を使用するデータ層があります。

オブジェクトの 1 つ (親オブジェクト) で Save メソッドを呼び出し、そのプライベート変数データを DataRow に変換して DataTable に追加したいと考えています。プライベート変数データの一部は、実際には他のオブジェクト (子オブジェクト) であり、それぞれ独自の Save メソッドを呼び出し、独自の変数データを保持する必要があります。

これを「レース」するにはどうすればよいですか?DataSet のどの部分を ParentObject でインスタンス化する必要があり、ChildObjects に渡してデータセットに追加できるようにする必要があるか?

また、2 つのテーブルの関係を結び付けるにはどうすればよいですか?

Order OrderDetail 関係について私が見た例では、OrderRow と OrderDetailRow を作成し、次に OrderDetailRow.SetParentRow(OrderDetail) を呼び出します。

私の Order と OrderDetail (例の名前付けを使用) は別のクラスにあり、例では Big Honking Method ですべてが発生しているため、これがうまくいくとは思いません。

ありがとう、キース

4

2 に答える 2

2

データセットが善か悪かという別の議論を始めるつもりはありません。引き続き使用する場合は、次の点を考慮してください。

  • 正しい挿入と更新を行うには、元のデータセットを保持して更新する必要があります。
  • あなたは両親に子供たちのことを知ってもらいたいと思っていますが、その逆は望んでいません。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 は、あなたの苦痛の一部を取り除きます。
  • これらはすべて、何もないところから作られています。不正確すぎないことを願っています。
于 2008-10-25T22:25:27.660 に答える
0

したがって、私が今行っているのは、DataSet への参照と親の DataRow への参照を子オブジェクトの Save メソッドに渡すことです。

これは、私がやっていることの概念を示す小さなコードです。

// some random save event in a gui.cs//
public void HandleSaveButtonClick()
{ parentObject.Save(); }


// Save inside the parentObject.cs //
public void Save()
{    
    CustomDataSet dataSet = new CustomDataSet();

    ParentObjectTableAdapter parentTableAdapter = new ParentObjectTableAdapter();

    DataTable dt = dataSet.ParentTable;
    DataRow newParentDataRow = dt.NewRow();
    newParentDataRow["Property1"] = "Hello";
    newParentDataRow["Property2"] = "World";
    dt.Rows.Add(newParentDataRow);

    parentTableAdapter.Update(dataSet.ParentTable);

    //save children
    _child1.Save(dataSet, newParentDataRow)


    dataSet.AcceptChanges();
}

//Save inside child1.cs //
public void Save(CustomDataSet dataSet, DataRow parentRow)
{

    Child1TableAdapter childTableAdapter= new Child1TableAdapter();

    DataTable dt = dataSet.ChildTable;

    DataRow dr = dt.NewRow();
    dr.SetParentRow(parentRow);
    dr["CProp1"] = "Child Property 1";    
    dt.Rows.Add(dr);

    childTableAdapter.Update(dataSet.ChildTable);

}

これがどのように見えるか教えてください。これは使用可能なパターンですか、それとも重要な何かが欠けていますか?

ありがとう、
キース

于 2008-09-29T23:59:26.907 に答える