「Fluent NHibernate」の版間の差分

imported>Administrator
編集の要約なし
imported>Administrator
編集の要約なし
14行目: 14行目:


== 使い方 ==
== 使い方 ==
=== データベース接続設定 ===
* [[Fluent NHibernate/データベース接続設定]]
Fluent NHibernateには各種データベースの接続用ドライバーも含まれているので、大半のデータベースは接続設定だけすれば動く。
* [[Fluent NHibernate/オートマッピング]] - 自動マッピング
 
* [[Fluent NHibernate/フルーエントマッピング]] - 手動マッピング
==== MySQL ====
[[MySQL]]の接続設定の例を示す。
 
なお、この例ではホスト名やユーザー名、パスワードなどのMySQL接続設定は[[アプリケーション構成ファイル]]のConnectionStringsに記載されたものを使う。
<source lang="csharp">
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();
    }
}
</source>
 
あまりお勧めできる方法ではないが、[[アプリケーション構成ファイル]]ではなく、[[MySQL]]の接続設定を直接[[ソースコード]]に埋め込む方法もある。
独自の設定ファイルを用いる場合にはこの方法を使うのもありかもしれない。
<source lang="csharp">
var dbConfig = MySQLConfiguration
    .Standard
    .ConnectionString(cs => cs
        .Server("127.0.0.1")
        .Username("user_name")
        .Password("pasword")
        .Database("database_name")
    )
)
</source>
 
==== SQLite ====
[[SQLite]]の接続設定。
Fluent NHibernateの公式サイトにあるサンプルはほぼSQLiteを使用しているので、公式サイトを見て回った方が早いかもしれない。
<source lang="csharp">
var dbConfig = SQLiteConfiguration
    .Standard
    .UsingFile("firstProject.db") // SQLiteファイルのパスを指定する。
</source>
 
=== オートマッピング(自動マッピング) ===
Fluent NHibernateにはオートマッピング(auto mappings)という、プログラマが書いたエンティティ(クラス)から自動的にリレーショナルデータベース上にテーブルなどを生成する機能がある。
 
==== 例 ====
<source lang="csharp">
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>();
    }
}
</source>
 
上記のようなクラス群があるとして、Fluent NHibernateの接続設定を以下のように記述し、実行すると、データベースへの初回接続時にクラスに対応するテーブルなどを自動生成しようと試みる。何かしらの理由で生成に失敗した場合は例外が発生する。
<source lang="csharp">
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();
    }
</source>
 
=== フルーエントマッピング(手動マッピング) ===
Fluent NHibernateではオートマッピングに加えフルーエントマッピング(fluent mappings)という手動マッピング機能を用意している。
 
マッピング設定にXMLファイルではなくC#のソースコードを用いるというFluent NHibernateの主目的ともいえる機能である。他サイトのサンプルを見る限り、大半の人はオートマッピングよりも細かく設定できるこちらを使っているようだ。
 
オートマッピングの記述例のAutoMappingsの部分がFluentMappingsになるような感じ。
<source lang="csharp">
                .Mappings(map => map.FluentMappings
                    .AddFromAssemblyOf<Product>()
                )
</source>
 
{{stub}}
{{stub}}