しばやん雑記

ASP.NET とメイドさんが大好きなフリーランスのプログラマーのブログ

LightSpeed ORM でフィールドコンバータを使ってみる

実際のプロジェクトでは予めデータベースが存在していて、さらに定義の変更も出来ずにプログラム側で対応する必要がある場合も出てくると思います。多分ね。

そんな時でも LightSpeed ORM ならフィールドコンバータという機能が用意されているので、残念なデータベースに対しても割とさくっと対応できます。

Mapping Database Types to Domain Types - Mindscape

例えば、以下のように 0 か 1 の 2 値しか取らないのに何故か int になっているケースを想定します。

f:id:shiba-yan:20130213212842p:plain

データベースの定義を変更することはできないので C# 側から bool として扱うために、以下のようなフィールドコンバータを作成します。

public class IntToBooleanConverter : FieldConverter<int, bool>
{
    protected override bool ConvertFromDatabase(int databaseValue)
    {
        return databaseValue != 0;
    }

    protected override int ConvertToDatabase(bool value)
    {
        return value ? 1 : 0;
    }
}

このコンバータはデータベース側の値が int で、コードから使う時の型を bool に変換するフィールドコンバータです。メソッド名で何を実装すればいいかわかると思いますので説明は省きます。

そしてこのコンバータを LightSpeed のデザイナに登録します。設定自体は LightSpeed ORM で Enum 型を使ってみる - しばやん雑記 の時と殆ど同じで User Defined Type を追加して CLR Type Name に System.Boolean を、Converter Type に作成したフィールドコンバータの型名を名前空間含めた形で設定するだけです。

f:id:shiba-yan:20130213213926p:plain

そして最後にプロパティの型をさっき追加した型名に設定するだけです。今回は IntToBoolean という名前なのでこれを選択します。

f:id:shiba-yan:20130213214712p:plain

これで保存すると、データベースは int のままですがコードからは bool として扱えるようにエンティティが生成されました。

f:id:shiba-yan:20130213214902p:plain

新規開発ならともかく、既存のデータベースから新しくアプリケーションを開発するケースではどんなデータが入っているかわかりませんので、柔軟に対応が可能な LightSpeed ORM はかなりおすすめです。