NHibernate - Fluent Hibernate
在本章中,我们将介绍 Fluent NHibernate。Fluent NHibernate 是另一种映射方式,或者您可以说它是 NHibernate 标准 XML 映射文件的替代方案。无需编写 XML (.hbm.xml 文件) 文档。借助 Fluent NHibernate,您可以在强类型 C# 代码中编写映射。
在 Fluent NHibernate 中,映射与应用程序的其余部分一起编译。
您可以像应用程序代码一样轻松更改映射,并且编译器不会对任何拼写错误进行处理。
它有一个常规配置系统,您可以在其中指定模式以覆盖命名约定和许多其他内容。
您还可以设置一次事物的命名方式,然后 Fluent NHibernate 会完成其余的工作。
让我们通过创建一个新的控制台项目来查看一个简单的示例。在本章中,我们将使用一个简单的数据库,其中有一个简单的客户表,如下图所示。

安装 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; } } }
现在我们需要使用流畅的 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 + " " + 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 个客户。
