Fluent NHibernate/フルーエントマッピング

Fluent NHibernateではオートマッピングに加えフルーエントマッピング(fluent mappings)という手動マッピング機能を用意している。NHibernateと違い、マッピング設定にXMLファイルではなくC#ソースコードを用いるというFluent NHibernateの主目的ともいえる機能である。

他サイトのサンプルを見る限り、大半の人はオートマッピングよりも細かく設定できるこちらを使っているようだ。 細かく設定できる分、相当難しい。 日本語の情報もほとんどない。

超入門 編集

エンティティを作る 編集

まずエンティティとなるクラスを作る。

アプリケーションを作るプログラマーが直接操作するのはエンティティクラスとなる。 このアプリケーションを作るプログラマーがエンティティクラスをゴニョゴニョすることで、一般的なSELECT/UPDATE/INSERT/DELETE(俗にいうCRUD)などのDB操作を実現することになる。

プロジェクトの中に「Entities」というディレクトリを作り、その中に格納しておくとわかりやすいと思う。

// 従業員エンティティクラス
public class Employee
{
    public virtual int Id { get; set; }
    public virtual string FirstName { get; set; }
    public virtual string LastName { get; set; }
}

マッピングを作る 編集

次にマッピングを記述するクラスを作る。 マッピングクラスはClassMap<>クラスを継承して作る。

マッピングクラスは、Fluent NHibernateがエンティティがどういう設定かを記述するクラスであり、エンティティを利用するプログラマーが直接参照するようなものではない。

Fluent NHibernateの99%は、このマッピングクラスの記述方法を覚えることだと思われる。 まったく理解は出来ていない。

プロジェクト内に「Mappings」というディレクトリを作り、その中に格納しておくとわかりやすいと思う。

// 従業員マッピングクラス
public class EmployeeMap : ClassMap<Employee>
{
    // デフォルトコンストラクタ
    // この中でマッピングの詳細を記述する。
    public EmployeeMap()
    {
        // プライマリキー
        Id(x => x.Id);
        // 普通のマッピング
        Map(x => x.FirstName);
        Map(x => x.LastName);
    }
}

アプリを作る 編集

次に実際にアプリケーションを作る。

Mappingの中身がFluentMappingsとなっているのが特徴。 オートマッピングの場合はAutoMappingsとなっていた部分である。

class AppMain
{
    public static void Main(string[] args)
    {
        var config = Fluently.Configure()
            // 接続設定
            .Database(
                SQLiteConfiguration.Standard
                    .UsingFile("firstProject.db")
            )
            // マッピングのありかを明示する。
            // 適当なクラスを指定すると、そのクラスが属するアセンブリ内の
            // マッピングクラスを自動検知して、あとは全自動でやってくれる。
            .Mappings(map =>
                map.FluentMappings.AddFromAssemblyOf<AppMain>())
            // マッピングからスキーマを自動生成する。
            .ExposeConfiguration(cfg => 
                new SchemaExport(cfg).Create(false, true))
            ;

        var factory = config.BuildSessionFactory();

        // 実際に使ってみる
        using (var session = factory.OpenSession())
        using (var transaction = session.BeginTransaction())
        {
            // insertしてみる
            var emp = new Expolyee();
            emp.FirstName = "test";
            emp.LastName  = "tarou";
            session.SaveOrUpdate(emp);

            transaction.Commit();
        }
    }
}

基本 編集

Id 編集

プライマリーキーとなる。

Map 編集

プロパティとマッピングする。

References 編集

多対1(many to one)を表す。

HasMany 編集

1対多(one to many)を表す。

HasManyToMany 編集

多対多(many to many)を表す。

HasOne 編集

1対1(one to one)を表す。

応用、その他 編集


関連項目 編集

参考文献 編集


外部リンク 編集