C#でFluentNHibernateを操作する方法

ORM(オブジェクトリレーショナルマッパー)は、CRUD(作成、読み取り、更新、および削除)操作を実行するコードを記述できるようにすることで、アプリケーションでのデータアクセスを簡素化します。ORMフレームワークは、アプリケーション内のオブジェクトモデルとデータモデルの間に存在するインピーダンスの不一致を排除するために長い間使用されてきました。本質的に、ORMを使用すると、基盤となるデータベースプロバイダーと直接対話する必要がなく、CRUD操作を実行するコードを記述できます。したがって、ORMを使用すると、アプリケーションのオブジェクトモデルをデータモデルから分離するのに役立ちます。

なぜ流暢なNHibernateなのか?

NHibernateは、マッピング情報をXML形式で.hbmファイルに保存します。エンティティクラスごとに1つの.hbmファイルが必要です。この.hbmファイルは、エンティティを対応するデータベーステーブルにマップするために使用されます。Fluent NHibernateを使用する際に、NHibernateで作業するときに使用しなければならなかった面倒な.hbm.xmlファイルを使用する必要がなくなりました。

Fluent NHibernateは、POCOクラスとNHibernateエンジン間のマッピングを作成するために使用できる人気のORMツールNHibernateの静的にコンパイルされた、コンパイル安全な対応物であり、面倒なXMLファイルの必要がありません。Fluent APIを提供し、LINQを使用してNHibernateエンジン上でデータをクエリすることもできます。次のセクションでは、Fluent NHibernateをインストールし、モデルを作成し、これらのモデルまたはエンティティクラスをマッピングし、FluentNHibernateを使用してCRUD操作を実行する方法について説明します。

入門

Fluent NHibernateの使用を開始するには、次の手順に従います。

  1. Visual Studio 2015IDEを開きます
  2. [ファイル]-> [新規]-> [プロジェクト]をクリックします
  3. 新しいプロジェクトを作成する–簡単にするために、Windowsアプリケーションを作成します
  4. プロジェクトの名前を指定します
  5. [OK]をクリックしてプロジェクトを保存します

Visual Studioでプロジェクトが作成されたので、FluentNHibernateをインストールしてアプリケーションで使用することをお勧めします。NuGetがインストールされている場合、最も簡単なオプションは、NuGetパッケージマネージャーを介してFluentNHibernateをインストールすることです。これを行うには、ソリューションエクスプローラーウィンドウでプロジェクトを選択し、右クリックして[NuGetパッケージの管理...]オプションを選択し、NuGetからFluentNHibernateフレームワークをインストールします。

FluentNHibernateでの作業

Fluent NHibernateを使用するには、最初にモデルクラスを作成する必要があります。次のデータベーステーブルについて考えてみます。

CREATE TABLE [dbo].[Product]

(

   [Id] INT NOT NULL PRIMARY KEY,

   [Name] VARCHAR(50) NULL,

   [Description] VARCHAR(50) NULL

)

対応するモデルクラスは次のとおりです。

public class Product

   {

       public virtual int Id { get; set; }

       public virtual string Name { get; set; }

       public virtual string Description { get; set; }

   }

データベーステーブルと対応するモデルクラスの準備ができたので、次のステップは必要なマッピングを作成することです。Fluent NHibernateでエンティティをマッピングするには、対応するマッピングクラスが必要です。このようなマッピングクラスは、ClassMapから派生する必要があります。ここで、Tは使用しているエンティティを表します。Fluent NHibernateは、強く型付けされたC#クラスを使用して、モデルクラスのプロパティをデータベーステーブルの対応するフィールドにマップします。

これがProductMapという名前のマッピングクラスです。

public class ProductMap : ClassMap

   {

       public ProductMap()

       {

           Id(x => x.Id);

           Map(x => x.Name);

           Map(x => x.Description);

           Table("Product");

       }

   }

次のステップは、データベースに接続するためのヘルパークラスを作成することです。このクラスは次のようになります。

public static class FluentNHibernateHelper

   {

       public static ISession OpenSession()

       {

string connectionString = "Write your database connection string here";

           ISessionFactory sessionFactory = Fluently.Configure()

               .Database(MsSqlConfiguration.MsSql2012

                 .ConnectionString(connectionString).ShowSql()

               )

               .Mappings(m =>

                         m.FluentMappings

                             .AddFromAssemblyOf())

               .ExposeConfiguration(cfg => new SchemaExport(cfg)

                .Create(false, false))

               .BuildSessionFactory();

           return sessionFactory.OpenSession();

       }

   }

最後のステートメントでのsessionFactory.OpenSession()の呼び出しに注意してください。この呼び出しは、実際には基盤となるデータベースとの通信セッションを作成します。つまり、使用中のデータベースへの接続を開きます。これで、静的メソッドFluentNHibernateHelper.OpenSession()を呼び出して、データベースへの接続を開くことができます。次のコードスニペットは、前に作成したヘルパークラスを利用して、ProductレコードをProductデータベーステーブルに追加する方法を示しています。

static void Main(string[] args)

       {

           using (var session = FluentNHibernateHelper.OpenSession())

           {

               var product = new Product { Name = "Lenovo Laptop", Description = "Sample product" };

               session.SaveOrUpdate(product);

           }

       }

次のコードスニペットは、FluentNHibernateヘルパークラスを使用してデータベースからデータをクエリする方法を示しています。

using (ISession session = FluentNHibernateHelper.OpenSession())

           {

               var products = session.Query().ToList();

               //Usual code

           }

この記事に記載されているコード例を使用するには、次の名前空間がクラスに追加されていることを確認する必要があります。

  • FluentNHibernate.Cfgを使用します。
  • FluentNHibernate.Cfg.Dbを使用します。
  • NHibernateを使用します。
  • NHibernate.Linqを使用します。
  • NHibernate.Tool.hbm2ddlを使用します。
  • System.Linqを使用する;

Fluent NHibernateの操作について詳しくは、GitHubをご覧ください。