В этой главе мы будем подробно рассказывать о 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 клиент.