レンタルの追加とDVDの更新

続けて、データを取り出して更新するコードを見てみましょう。ここでは新しいレンタルを作成し、先ほど登録したDVDを関連づけて保存します。

データを複数件取り出して、更新するプログラム

private void btnUpdate_Click(object sender, EventArgs e)
{
  using (LsUnitOfWork uow = _context.CreateUnitOfWork())
  {
    //DVDのリストを取得
    IList<Dvd> list = uow.Find<Dvd>();

    //レンタルを生成
    Rental r = new Rental();
    r.DaySpan = 7;

    //レンタルに3個のDVDを紐づけ
    r.Dvds.Add(list[0]);
    r.Dvds.Add(list[1]);
    r.Dvds.Add(list[2]);

    //(参考)DVDにレンタルを紐づけても同じ
    //list[0].Rental = r;
    //list[1].Rental = r;
    //list[2].Rental = r;

    //変更を保存
    uow.SaveChanges();
  }
}

データの取り出し(複数件SELECT)

ここでは「Find<Dvd>()」と指定することで、Dvdの全データを取り出しています。複数件のデータを取得するには、UnitOfWorkクラスのFindメソッドを使います。このFindメソッドでは取得するエンティティをパラメータに指定します。

更新(UPDATE)

続けてデータを登録/更新します。新しいRentalクラスをインスタンス化し、Dvdsプロパティに3件のDvdを関連づけています。そして、最後に保存(SaveChanges)しています。 ここではRentalクラスをUnitOfWorkクラスに登録(Add)していません。しかしDvdクラスをUnitOfWorkクラスから取り出しているので、Dvdクラスと関連付けられているRentalクラスもUnitOfWorkクラスの管理対象となっています。

更新結果の確認

正しくデータが更新されたかテーブルを確認してみましょう。

データの更新結果(Rentalの挿入とDvdの更新)

Rentalテーブルにデータが登録され、DvdテーブルのRentalId列が更新されています。UnitOfWorkクラスが、エンティティの状態を判定し、INSERTとUPDATEを振り分けて実行していることが分かります。

レンタルの削除

最後に、レンタルのデータを1件取得して削除します。

データを1件取り出して、削除するプログラム

//レンタルを取得して削除
Rental r = uow.FindOne<Rental>(11);
uow.Remove(r);
uow.SaveChanges();

データの取り出し(1件SELECT)

ここでは「FindOne<Rental>(11)」と指定して、RentalクラスのIDが11のデータを取り出しています。1件のデータを取得するには、UnitOfWorkクラスのFindOneメソッドを使います。Findメソッドと同様に取得するエンティティをパラメータに指定します。

データの削除(DELETE)

データを削除するには、UnitOfWorkクラスのRemoveメソッドを呼び出します。引数に削除対象のエンティティを指定します。そして、SaveChangesメソッドを呼び出すとDELETE文が実行されます。

削除結果の確認

Rentalテーブルのデータが削除され、DvdテーブルのRentalIdがNullに更新されていることが分かります。

データの削除結果(Rentalの削除とDvdの更新)

前回のモデル設定(RentalとDvdの関連の設定)で[Is Nullable]プロパティをTrueにセットしているために、Rentalを削除してもDvdは削除されずRentalIdにNullがセットされます。もし[Is Nullable]プロパティをFalseに設定すれば、Dvdのデータも連動して削除されます。

まとめ

以上、本編では、UnitOfWorkクラスを使って、エンティティを追加、更新、参照、削除する方法について紹介してきました。次回は、条件を指定してエンティティを抽出するクエリの書き方等について紹介します。