2015年9月4日金曜日

DapperExtensionsを使ってみる2

前回に引き続きDapperExtensionsの小ネタです。
※我ながら遅筆にもほどがある。


今回は、テーブル名や、カラム名がエンティティクラスと異なる場合や、
主キーが複数の場合の対応です。特に主キーは1個にしといてよっと
いいたいところなんですが、会社で業務アプリをさわってる以上、
避けられない、っというか、ほぼ全部ですよってことで。


やり方

前回は複数形のテーブル名を単数形のクラス名に変換するためにすでに準備されている、PluralizedAutoClassMapperをDapperExtensions.DefaultMapperに 設定しましたが、今回はこの部分をカスタムで作ってやる必要があります。


前提条件


こんなテーブルがあったとします。(テーブル名は"syain")


こんなエンティティクラスにMappingしたいです。
public class Person
{
    public int BuilderId { get; set; }
    public string PersonId { get; set; }
    public string Name { get; set; }
}

  • gyousya_id(int)とsyain_id(nvarchar)で複合キー
  • テーブル名syainをPersonに
  • カラム名gyosya_idをBuilderIdに
  • カラム名syain_idをPersonIdに
  • カラム名namaeをNameに


とりあえずやってみる


1.CustomMapperの作成


DapperExtensions.Mapper名前空間にあるClassMapperを継承したCustomMapperを作成します。
01:using DapperExtensions.Mapper;
02:public sealed class CustomClassMapper< T > : ClassMapper< T > where T : class
03:{
04:    public CustomClassMapper()
05:    {
06:        if (typeof(T) == typeof(Person))
07:         {
08:             Table("syain");
09:             Map(x => (x as Person).BuilderId).Column("gyosya_id").Key(KeyType.Assigned);
10:             Map(x => (x as Person).PersonId).Column("syain_id").Key(KeyType.Assigned);
11:             Map(x => (x as Person).Name).Column("namae");
12:        }
13:         AutoMap();
14:    }
15:}

2.DefaultMapperの指定


先ほど作成したCustomMapperをDefaultMapperに指定します。
DapperExtensions.DapperExtensions.DefaultMapper = typeof(CustomClassMapper<>);
この処理はアプリケーション起動時に1回呼ぶだけでおっけーです(前回と一緒です)。 あとはInsert/Update/Deleteも前回と同じ方法で行うことが可能です。


解説・ポイント


  • 01行目:DapperExtensions.Mapper空間のClassMapperを継承したクラスを作成します。
  • 04行目:コンストラクタを作成します。この中にマッピング定義を記載します。
  • 06行目:マッピング対象のクラスを判別します。複数テーブルのマッピングを定義する場合は、ここで切り分けます。
  • 08行目:テーブル名のマッピング定義です。エンティティクラス名とテーブル名が同一の場合は不要です。
  • 09~10行目:主キーが複数の場合の定義です。
  • 11行目:カラム名のマッピング定義です。テーブル名同様、変更がない場合は不要です。
  • 13行目:これはデフォルトのマッピングを追加するメソッドになります。テーブルに「birthday」というカラムがあり、エンティティクラスにも「birthday」という同名のプロパティがある場合必要になります。(今回の例の場合不要ですが、やらないと全定義を記載する必要があるため参考までに記載してあります。)

ポイントとなるのは9~10行目です。今回はカラム名のマッピングとキー指定を同時に行っているため、Column("~").Key(KeyType.Assigned)といった記載になります。
カラム名のマッピングが不要の場合はColumn("~")の部分は不要です。


感想

テーブル数の数だけ、Mapping定義を追加していかなくてはならないので、最初がとても
めんどうです。が、1回設定してしまえば終わりなので(データベースの主キーや名前が変わる
ってことはまずないので)、そこさえ乗り切ってしまえば、さくさく使えるようになって便利です!