読者です 読者をやめる 読者になる 読者になる

しばやん雑記

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

LightSpeed ORM を真面目に使ってみた

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

Lightspeed Orm

最近は Entity Framework よりも LightSpeed を使って開発をしています。UnitOfWork とか Per-Request での生成が用意されているので、Entity Framework よりも楽な感じです。

しかし、最初は戸惑うと思うので自分のためにもメモしておきます。

LightSpeedContext の作成

まずは全ての基本である LightSpeedContext を作成します。こいつはアプリケーションで 1 つだけあればいいので static で定義しておきます。ちなみにコンストラクタ引数は接続文字列の名前です。

public static class MyDbContext
{
    private static readonly LightSpeedContext<MyDbUnitOfWork> LightSpeedContext = new LightSpeedContext<MyDbUnitOfWork>("Default");

    public static LightSpeedContext<MyDbUnitOfWork> Default
    {
        get { return LightSpeedContext; }
    }
}

ちなみに接続文字列は以下のように定義します。

<configSections>
   <section name="lightSpeedContexts" 
              type="Mindscape.LightSpeed.Configuration.LightSpeedConfigurationSection, Mindscape.LightSpeed" />
</configSections>
<lightSpeedContexts>
  <add name="Default" connectionStringName="DefaultConnection" />
</lightSpeedContexts>
<connectionStrings>
  <add name="DefaultConnection"
       connectionString="..." />
</connectionStrings>

リクエストごとに MyDbUnitOfWork を作成

ASP.NET MVC のコントローラなどで UnitOfWork を作成するコードを追加しておきます。この時、1 つのリクエスト中では共有したいので HttpContext の Items プロパティを使って共有するようにします。

private const string UnitOfWorkKey = "__UnitOfWork__";

public MyDbUnitOfWork UnitOfWork
{
    get
    {
        UnitOfWorkScopeBase<MyDbUnitOfWork> unitOfWorkScope = null;

        var context = HttpContext.Current;

        if (context != null)
        {
            unitOfWorkScope = context.Items[UnitOfWorkKey] as PerRequestUnitOfWorkScope<MyDbUnitOfWork>;
        }

        if (unitOfWorkScope == null)
        {
            unitOfWorkScope = new PerRequestUnitOfWorkScope<MyDbUnitOfWork>(MyDbContext.Default);

            if (context != null)
            {
                context.Items[UnitOfWorkKey] = unitOfWorkScope;
            }
        }

        return unitOfWorkScope.Current;
    }
}

Mindscape.LightSpeed.Web.dll に LightSpeedControllerBase というクラスが用意されているので、これを使ってもいいです。

リクエスト完了後に MyDbUnitOfWork を削除

リクエストに対する処理が完了したら作成した UnitOfWork を削除します。PerRequestUnitOfWorkScope を使えば、簡単に現在のリクエストに関連付いた UnitOfWork を取得することが出来ます。

protected void Application_EndRequest(object sender, EventArgs e)
{
    var scope = new PerRequestUnitOfWorkScope<MyDbUnitOfWork>(MyDbContext.Default);

    if (scope.HasCurrent)
    {
        scope.Current.Dispose();
    }
}

NOT NULL 制約付きのカラムに空文字列が入らない場合

LightSpeed では NOT NULL 制約が付いているカラムには、自動的に Validate Presence が True になります。

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

この設定では NULL 以外に空文字列を入れようとした場合にも検証でエラーになります。NULL と同様に空文字列は実質意味がないという扱いになるわけですね。

なので、Validate Presence を False にすると空文字列を格納することが出来ます。

ダイアグラムを綺麗に表示する

サーバエクスプローラからテーブルをドロップした場合、以下のように残念なダイアグラムが表示されます。

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

こんな場合にはデザイナを右クリックして「Arrange」を選べば、いい感じに整形してくれます。

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