Nhibernate-fluent-hibernate

提供:Dev Guides
移動先:案内検索

NHibernate-流Hな休止状態

この章では、流NHなNHibernateを取り上げます。 Fluent NHibernateはマッピングのもう1つの方法です。または、NHibernateの標準XMLマッピングファイルの代替と言えます。 XML *(。hbm.xmlファイル)*ドキュメントを記述する代わりに。 Fluent NHibernateの助けを借りて、強く型付けされたC#コードでマッピングを書くことができます。

  • Fluent NHibernateでは、マッピングはアプリケーションの他の部分とともにコンパイルされます。
  • アプリケーションコードと同じようにマッピングを簡単に変更でき、コンパイラはタイプミスで失敗します。
  • 従来の構成システムがあり、命名規則や他の多くのものをオーバーライドするためのパターンを指定できます。
  • 一度名前を付ける方法を設定することもできます。その後、Fluent NHibernateが残りを行います。

新しいコンソールプロジェクトを作成して、簡単な例を見てみましょう。 この章では、次の図に示すように、単純なCustomerテーブルを持つ単純なデータベースを使用します。

シンプルな顧客テーブル

Fluent NHibernateをインストールする

最初のステップは、Fluent NHibernateを開始することです。FluentNHibernateパッケージをインストールします。 したがって、 NuGet Package Manager Console を開き、次のコマンドを入力します。

PM> install-package FluentNHibernate

正常にインストールされると、次のメッセージが表示されます。

正常にインストールされました

Customerの単純なモデルクラスを追加してみましょう。次のプログラムは、Customerクラスの実装を示しています。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace FluentNHibernateDemo {
   class Customer {
      public virtual int Id { get; set; }
      public virtual string FirstName { get; set; }
      public virtual string LastName { get; set; }
   }
}

流NHなNHibernateを使用してマッピングを作成する必要があるため、プロジェクトにもう1つのクラス CustomerMap を追加します。 CustomerMapクラスの実装は次のとおりです。

using FluentNHibernate.Mapping;
using System;
using System.Collections.Generic;
using System.Linq; using System.Text;
using System.Threading.Tasks;

namespace FluentNHibernateDemo {
   class CustomerMap : ClassMap<Customer> {
      public CustomerMap() {
         Id(x => x.Id);
         Map(x => x.FirstName);
         Map(x => x.LastName);
         Table("Customer");
      }
   }
}

別のクラス NHibernateHelper を追加して、異なる構成設定を設定します。

using FluentNHibernate.Cfg;
using FluentNHibernate.Cfg.Db;
using NHibernate;
using NHibernate.Tool.hbm2ddl;

namespace FluentNHibernateDemo {

   public class NHibernateHelper {

      private static ISessionFactory _sessionFactory;

      private static ISessionFactory SessionFactory {
         get {
            if (_sessionFactory == null)
            InitializeSessionFactory(); return _sessionFactory;
         }
      }

      private static void InitializeSessionFactory() {
         _sessionFactory = Fluently.Configure()

         String Data Source = asia13797\\sqlexpress;
         String Initial Catalog = NHibernateDemoDB;
         String Integrated Security = True;
         String Connect Timeout = 15;
         String Encrypt = False;
         String TrustServerCertificate = False;
         String ApplicationIntent = ReadWrite;
         String MultiSubnetFailover = False;

         .Database(MsSqlConfiguration.MsSql2008 .ConnectionString(
            @"Data Source + Initial Catalog + Integrated Security + Connect Timeout
            + Encrypt + TrustServerCertificate + ApplicationIntent +
            MultiSubnetFailover") .ShowSql() )

         .Mappings(m => m.FluentMappings
         .AddFromAssemblyOf<Program>())
         .ExposeConfiguration(cfg => new SchemaExport(cfg)
         .Create(true, true))
         .BuildSessionFactory();
      }

      public static ISession OpenSession() {
         return SessionFactory.OpenSession();
      }
   }
}

次に、セッションを開始する Program.cs ファイルに移動して、新しい顧客を作成し、その顧客を以下に示すようにデータベースに保存します。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace FluentNHibernateDemo {
   class Program {

      static void Main(string[] args) {

         using (var session = NHibernateHelper.OpenSession()) {

            using (var transaction = session.BeginTransaction()) {
               var customer = new Customer {
                  FirstName = "Allan",
                  LastName = "Bomer"
               };

               session.Save(customer);
               transaction.Commit();
               Console.WriteLine("Customer Created: " + customer.FirstName + "\t" +
                  customer.LastName);
            }

            Console.ReadKey();
         }
      }
   }
}

アプリケーションを実行してみましょう。次の出力が表示されます。

if exists (select * from dbo.sysobjects where id = object_id(N'Customer') and
   OBJECTPROPERTY(id, N'IsUserTable') = 1) drop table Customer

create table Customer (
   Id INT IDENTITY NOT NULL,
   FirstName NVARCHAR(255) null,
   LastName NVARCHAR(255) null,
   primary key (Id)
)

NHibernate: INSERT INTO Customer (FirstName, LastName) VALUES (@p0, @p1);
   select SCOPE_IDENTITY();@p0 = 'Allan' [Type: String (4000)],
   @p1 = 'Bomer' [Type: String (4000)]
   Customer Created: Allan Bomer

ご覧のとおり、新しい顧客が作成されます。 顧客レコードを表示するには、データベースに移動してデータの表示を確認します。1人の顧客が追加されていることがわかります。

顧客レコード