|
imported>Fallout New Tokyo |
| (2人の利用者による、間の9版が非表示) |
| 1行目: |
1行目: |
| '''Fluent NHibernate'''(ふるーえんと・えぬはいばねーと)とは、[[.NET Framework]]向けの[[ORM]]のひとつである[[NHibernate]]の[[ラッパーライブラリ]]である。 | | '''Fluent NHibernate'''(読み:ふるーえんと・えぬはいばねーと)とは、[[.NET Framework]]向けの[[ORM]]のひとつである[[NHibernate]]の[[ラッパーライブラリ]]である。 |
|
| |
|
| == 概要 == | | == 概要 == |
| [[NHibernate]]では[[データベース]]の接続設定やマッピングを記述するのに[[XML]]を用いる。一方、Fluent NHibernateではXMLの代わりに[[C Sharp|C#]]による[[プログラム]]でそれらを記述する。 | | Fluentは日本語で「流暢な」や「さくさく」という意味であり、直訳すると「さくさくハイバネート」となる。 |
| | 似たような言い回しには以下のようなものがある。 |
| | * [[たのしいRuby]] |
| | * [[すごいHaskellたのしく学ぼう!]] |
| | * [[みんなのPython]] |
| | * [[ボクらのScala ~ 次世代Java徹底入門]] |
| | |
| | [[Hibernate]]および[[NHibernate]]は、よく[[Ruby]]界隈で圧倒的な勢力をもつ[[ActiveRecord]]と比較され、多くの場面でボロクソに言われているのが実情である。しかも、その話題が過熱しすぎると[[ORM]]単体どころか[[Java]]は[[プログラミング言語]]としても劣っている云々という話に飛躍するくらい酷い有様である。 |
| | |
| | そこへ颯爽と登場したのが、指摘されていた問題点を[[C Sharp|C#]]の変態機能を使いまくることで解決しまくった「さくさくハイバネート」である。 |
| | |
| | == 特徴 == |
| | [[NHibernate]]では[[データベース]]の接続設定やマッピングを記述するのに[[XML]]を用いる。一方、Fluent NHibernateではXMLの代わりに[[C Sharp|C#]]の[[ソースコード]]でそれらを記述する。 |
|
| |
|
| [[XML]]ではなく[[C Sharp|C#]]の[[ソースコード]]として記述することで、実行時にXMLを動的に解析するのに比べ、実行前に[[コンパイラ]]による最低限の記述ミスのチェックを行え、より安全性が高まるという利点がある。 | | [[XML]]ではなく[[C Sharp|C#]]の[[ソースコード]]として記述することで、実行時にXMLを動的に解析するのに比べ、実行前に[[コンパイラ]]による最低限の記述ミスのチェックを行え、より安全性が高まるという利点がある。 |
| 14行目: |
26行目: |
|
| |
|
| == 使い方 == | | == 使い方 == |
| === データベース接続設定 ===
| | * [[Fluent NHibernate/データベース接続設定]] |
| Fluent NHibernateには各種データベースの接続用ドライバーも含まれているので、大半のデータベースは接続設定だけすれば動く。 | | * [[Fluent NHibernate/オートマッピング]] - 自動マッピング |
| | * [[Fluent NHibernate/フルーエントマッピング]] - 手動マッピング。Fluent NHibernateの核となる機能である。 |
|
| |
|
| ==== MySQL ====
| |
| [[MySQL]]の接続設定の例を示す。
| |
|
| |
|
| なお、この例ではホスト名やユーザー名、パスワードなどのMySQL接続設定は[[アプリケーション構成ファイル]]のConnectionStringsに記載されたものを使う。
| | なお、[[クエリ]]などの部分はほぼ[[NHibernate]]そのものを使うことになる。 |
| <source lang="csharp">
| | よってそれらの使い方は「[[NHibernate]]」の項目を参照。 |
| using FluentNHibernate;
| |
| using FluentNHibernate.Cfg;
| |
| using FluentNHibernate.Cfg.Db;
| |
| using NHibernate;
| |
| using NHibernate.Tool.hbm2ddl;
| |
|
| |
|
| public class SampleApp
| | {{stub}} |
| { | |
| 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}}
| | == 便利ツール == |
| | * [[Visual NHibernate]] - ER図などを用いてビジュアルにマッピングを書ける商用ソフト。 |
|
| |
|
| == 関連項目 == | | == 関連項目 == |
| 137行目: |
44行目: |
|
| |
|
| == 参考文献 == | | == 参考文献 == |
| <references/>
| | {{reflist}} |
|
| |
|
| == 外部リンク == | | == 外部リンク == |