Учебники

NHibernate — Свободный Hibernate

В этой главе мы будем подробно рассказывать о NHibernate. Свободный NHibernate — это еще один способ сопоставления, или вы можете сказать, что он является альтернативой стандартным файлам сопоставления XML для NHibernate. Вместо написания XML (.hbm.xml файлов) документов. С помощью Fluent NHibernate вы можете писать сопоставления в строго типизированном коде C #.

  • В Fluent NHibernate сопоставления компилируются вместе с остальной частью вашего приложения.

  • Вы можете легко изменить ваши отображения так же, как код вашего приложения, и компилятор потерпит неудачу при любых опечатках.

  • Он имеет обычную систему конфигурации, в которой вы можете указать шаблоны для переопределения соглашений об именах и многое другое.

  • Вы также можете установить, как вещи должны быть названы один раз, тогда Fluent NHibernate сделает все остальное.

В Fluent NHibernate сопоставления компилируются вместе с остальной частью вашего приложения.

Вы можете легко изменить ваши отображения так же, как код вашего приложения, и компилятор потерпит неудачу при любых опечатках.

Он имеет обычную систему конфигурации, в которой вы можете указать шаблоны для переопределения соглашений об именах и многое другое.

Вы также можете установить, как вещи должны быть названы один раз, тогда Fluent NHibernate сделает все остальное.

Давайте рассмотрим простой пример, создав новый консольный проект. В этой главе мы будем использовать простую базу данных, в которой у нас есть простая таблица Customer, как показано на следующем рисунке.

Простой клиентский стол

Установите Fluent NHibernate

Первым шагом для запуска Fluent NHibernate является установка пакета Fluent NHibernate. Поэтому откройте консоль диспетчера пакетов NuGet и введите следующую команду.

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; } 
   } 
}

Теперь нам нужно создать Mappings, используя свободный NHibernate, поэтому добавьте еще один класс 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 клиент.