Fluent NHibernate
Fluent NHibernate(ふるーえんと・えぬはいばねーと)とは、.NET Framework向けのORMのひとつであるNHibernateのラッパーライブラリである。
目次
概要
NHibernateではデータベースの接続設定やマッピングを記述するのにXMLを用いる。一方、Fluent NHibernateではXMLの代わりにC#によるプログラムでそれらを記述する。
XMLではなくC#のソースコードとして記述することで、実行時にXMLを動的に解析するのに比べ、実行前にコンパイラによる最低限の記述ミスのチェックを行え、より安全性が高まるという利点がある。
また、Visual StudioやMonoDevelopなどの統合開発環境を使用することでインテリセンスなどの入力補完なども使えるため、シンタックスエラーなどの些細な記述ミスによるバグを抑制することができる。
さらにFluent NHibernateでは、Rubyなどでよく使われるActive Recordのようにマッピングクラスに基づき、それらに対応するデータベース上のテーブルの自動生成するオートマッピング機能を備えている。Fluent NHibernateのオートマッピング機能では、マッピングクラスを個別に明示し生成することも、.NET Frameworkのアセンブリを指定することで、そのアセンブリの中で使われているマッピングクラスを自動認識させ、そこから一気に自動生成を行うこともできるようになっている。
インストール
Visual Studioを用いている場合はNuGetを使うことで、Fluent NHibernateおよびNHibernateなどの依存するその他のライブラリも一括でインストールできるので便利である。[1]
使い方
データベース接続設定
Fluent NHibernateには各種データベースの接続用ドライバーも含まれているので、大半のデータベースは接続設定だけすれば動く。
MySQL
MySQLの接続設定の例を示す。
なお、この例ではホスト名やユーザー名、パスワードなどのMySQL接続設定はアプリケーション構成ファイルのConnectionStringsに記載されたものを使う。
using FluentNHibernate;
using FluentNHibernate.Cfg;
using FluentNHibernate.Cfg.Db;
using NHibernate;
using NHibernate.Tool.hbm2ddl;
public class SampleApp
{
public void Main(string[] args)
{
// MySQLの場合
var dbConfig = MySQLConfiguration
.Standard
.ConnectionString(cs => cs.FromConnectionStringWithKey("db"))
;
// 多くのサンプルでは↑と↓をメソッドチェーンで合体させて記述してあることが多い。
// そのような書き方は個人的にはあまり好きではない。
var fnConfig = Fluently.Configure()
.Database(dbConfig)
;
var factory = fnConfig.BuildSessionFactory();
}
}
あまりお勧めできる方法ではないが、アプリケーション構成ファイルではなく、MySQLの接続設定を直接ソースコードに埋め込む方法もある。 独自の設定ファイルを用いる場合にはこの方法を使うのもありかもしれない。
var dbConfig = MySQLConfiguration
.Standard
.ConnectionString(cs => cs
.Server("127.0.0.1")
.Username("user_name")
.Password("pasword")
.Database("database_name")
)
)
SQLite
SQLiteの接続設定。 Fluent NHibernateの公式サイトにあるサンプルはほぼSQLiteを使用しているので、公式サイトを見て回った方が早いかもしれない。
var dbConfig = SQLiteConfiguration
.Standard
.UsingFile("firstProject.db") // SQLiteファイルのパスを指定する。
オートマッピング(自動マッピング)
Fluent NHibernateにはオートマッピング(auto mappings)という、プログラマが書いたエンティティ(クラス)から自動的にリレーショナルデータベース上にテーブルなどを生成する機能がある。
例
public class Product
{
public virtual int Id { get; set; }
public virtual string Name { get; set; }
public virtual decimal Price { get; set; }
}
public class Shelf
{
public virtual int Id { get; set; }
public virtual IList<Product> Products { get; set; }
public Shelf()
{
Products = new List<Product>();
}
}
上記のようなクラス群があるとして、Fluent NHibernateの接続設定を以下のように記述し、実行すると、データベースへの初回接続時にクラスに対応するテーブルなどを自動生成しようと試みる。何かしらの理由で生成に失敗した場合は例外が発生する。
using FluentNHibernate;
using FluentNHibernate.Cfg;
using FluentNHibernate.Cfg.Db;
using FluentNHibernate.Automapping;
using NHibernate;
using NHibernate.Tool.hbm2ddl;
public class SampleApp
{
public void Main(string[] args)
{
// MySQLの場合
var fnConfig = Fluently.Configure()
.Database(/* 接続設定 */)
.Mappings(map =>
map.AutoMappings.Add(AutoMap.AssemblyOf<Product>())
)
;
var factory = fnConfig.BuildSessionFactory();
}
フルーエントマッピング(手動マッピング)
Fluent NHibernateではオートマッピングに加えフルーエントマッピング(fluent mappings)という手動マッピング機能を用意している。
マッピング設定にXMLファイルではなくC#のソースコードを用いるというFluent NHibernateの主目的ともいえる機能である。他サイトのサンプルを見る限り、大半の人はオートマッピングよりも細かく設定できるこちらを使っているようだ。