簡易ORMフレームワークを作成してみる(1)

.NETの型指定されたDataSetをメタデータとしてORマッピングできる簡易フレームワークを作成してみる。
あまり複雑なことはしないで、できるだけシンプルなものにする予定だ。

まず、最初のシナリオは以下のようなものをターゲットにしてみる。

[Test]
public void 最初のシナリオ()
{
    //型指定されたDataSetをメタデータとするデータアダプタ
    DataSetDataAdapter da = new SqlDataSetDataAdapter(new CustomersDataSet());

    //検索条件の作成
    QueryObject qo1 = new QueryObject();
    qo1.Filter = qo1.Eq("CustomerID", "ALFKI");

    //検索の実施
    CustomersDataSet target1 = new CustomersDataSet();
    da.Fill(target1, qo1);

    //検索結果の確認
    CustomersDataSet.CustomersRow cust 
        = target1.Customers.FindByCustomerID("ALFKI");
    Assert.AreEqual(6, cust.GetOrdersRows().Length);

    //更新の実施
    target1.Customers[0].CompanyName = "TEST";
    da.Update(target1);

    //更新結果の確認
    QueryObject qo2 = new QueryObject();
    qo2.Filter = qo2.Eq("CompanyName", "TEST");
    CustomersDataSet target2 = new CustomersDataSet();
    da.Fill(target2, qo1, true);
    Assert.AreEqual("TEST", target2.Customers[0].CompanyName);            
}

基本的には組み込みのXxxDataAdapterの発想と同じであるが、SQL文は一切指定しなくても自動的に型指定されたDataSetの情報からSQL文を組み立ててくれるようにする。さらにリレーションを自動的にナビゲーションしながら関連テーブルを自動的に検索・更新してくれるようにする。たとえば、上記のコードはCustomersテーブルを起点に検索した場合、→Orders→Order Details→Products、→CustomerCustomerDemo→CustomerDemographicsの順に関連するテーブルをSELECTすることになる。

あと、RoRにもあるような組み込みの特殊な列名をいくつか含めるようにしてみたい。