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

きよくらの備忘録

「三日坊主と呼ばせない!日記」改め。主にソフトウェア開発関連の話題。

WebMatrix(ASP.NET WebPages)でDapperを使う

.NET用のMicro-ORMであるDapper dot net (Daper.NET)は、WebMatrixでも利用する事が出来ます。

WebMatrixには元々簡易ORM的な機能を持ったDatabaseクラス (WebMatrix.Data.Database) が標準で用意されています。しかし、自分で用意したクラスにマッピングすることはできませんし、明示的にトランザクションを使用したい場合も利用できません*1

もしDatabaseクラスに物足りなくなったら、次の選択肢としてはDapperがお勧めです。

導入方法等をを軽く紹介してみたいと思います。

 

WebMatrixでDapperを使う手順

1.NuGetでDapper dot netをインストール

NuGetギャラリーを「dapper」で検索し、Dapper dot netを探してインストールしてください。WebMatrix向けパッケージとしても公開されていますので、そのまま検索すれば出てきます。

f:id:kiyokura:20131028024105p:plain

[インストールする]をクリックした後、いくつかライセンスや確認画面が出てきますので、画面の指示に従い操作してください。さくっと入ると思います。

 

2.usingする(Importsする)

Dapperの主な機能は拡張メソッドで提供されていますので、利用する場合はそのソースコードの先頭でusing(VB.NETの場合はImports)されている必要があります。Razorの場合は、「@uging(VB.NETの場合は@Imports)」という構文を使います。

Razor(C#)でのDapperのusing

以上で利用準備は終了です。

 

dapperを使ったサンプル

最後に、少しだけDapperを使ったサンプルを。今回DBはSQL Server CEを利用したサンプルコードになっていますが。SQL ServerMySQLの場合でもほぼ同じように利用できます*2

1.Database.Queryと同じように使う場合

Database.Queryと同じように、dynamicで結果を受ける場合はこんな感じでいけます。 RazorでのDapperサンプル(dynamicで受け取る場合)

 

2.クラスにマッピングする場合

あらかじめ用意したクラスにマッピングする場合はこんな感じです。マッピング先のクラスUserEntityは、今回は@functionsを使ってインナークラスとして定義しましたが、もちろん別ファイルにしてApp_Codeフォルダ内に配置してもかまいません。 RazorでのDapperサンプル(用意した型で受け取る場合)

こうしてやれば、利用箇所では当然、コード補完が効くようになります。これもメリットですね。

f:id:kiyokura:20131028024133p:plain

 

3.トランザクションを使ったUpdate文を実行する場合

最後に、トランザクションを使いつつUpdateするサンプルです。 RazorでのDapperサンプル(トランザクション使ってUpdate)

 

まとめ

いかがでしたでしょうか。 単純に利用するだけなら使用感はDatabaseとさほど変わらないように思いますし、"ちょっとだけ込み入った"事をしたい場合も"ちょっとだけ手間を増やす"事で比較的シンプルさを保ったまま対応できると思います。

ASP.NET WebPagesでどこまでヤヤコシイことをやるか?』という話はあるかもしれません。しかし、更新系で少し込み入ったことをやろうとすれば、トランザクションの処理が必要になる局面は少なくないように思います。そんな時、選択肢の一つとして考えてみてはいかがでしょうか。

Dapper自体について知りたい方は、Dapper dot netの公式サイトを見ていただくか、概要レベルであればこちらのスライド『ADO.NETとORMとMicro-ORM -dapper dot netを使ってみた』もよければご覧になってください。

*1:DataBase.ConnectionプロパティはSystem.Data.Common.DbConnectionなので一見使えそうですが、DataBase.Query()メソッド等がDbTransactionを考慮しない。結果的に生ADO.NETでやるのと同じになる。

*2:Connectionオブジェクトさえ作ってしまえばほぼ同じ。パラメタライズドクエリのバインド変数の書き方がDBごとに違う場合があるくらいだと思います。