「Fluent NHibernate」を編集中
ナビゲーションに移動
検索に移動
この編集を取り消せます。 下記の差分を確認して、本当に取り消していいか検証してください。よろしければ変更を保存して取り消しを完了してください。
最新版 | 編集中の文章 | ||
1行目: | 1行目: | ||
− | '''Fluent NHibernate''' | + | '''Fluent NHibernate'''(ふるーえんと・えぬはいばねーと)とは、[[.NET Framework]]向けの[[ORM]]のひとつである[[NHibernate]]の[[ラッパーライブラリ]]である。 |
== 概要 == | == 概要 == | ||
− | + | [[NHibernate]]では[[データベース]]の接続設定やマッピングを記述するのに[[XML]]を用いる。一方、Fluent NHibernateではXMLの代わりに[[C Sharp|C#]]による[[プログラム]]でそれらを記述する。 | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | [[NHibernate]]では[[データベース]]の接続設定やマッピングを記述するのに[[XML]]を用いる。一方、Fluent NHibernateではXMLの代わりに[[C Sharp|C#]] | ||
[[XML]]ではなく[[C Sharp|C#]]の[[ソースコード]]として記述することで、実行時にXMLを動的に解析するのに比べ、実行前に[[コンパイラ]]による最低限の記述ミスのチェックを行え、より安全性が高まるという利点がある。 | [[XML]]ではなく[[C Sharp|C#]]の[[ソースコード]]として記述することで、実行時にXMLを動的に解析するのに比べ、実行前に[[コンパイラ]]による最低限の記述ミスのチェックを行え、より安全性が高まるという利点がある。 | ||
26行目: | 14行目: | ||
== 使い方 == | == 使い方 == | ||
− | + | === データベース接続設定 === | |
− | + | 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}} | ||
− | |||
− | |||
− | |||
== 関連項目 == | == 関連項目 == | ||
44行目: | 137行目: | ||
== 参考文献 == | == 参考文献 == | ||
− | + | <references/> | |
== 外部リンク == | == 外部リンク == |