NHibernate - 流暢的NHibernate



本章將介紹流暢的NHibernate。流暢的NHibernate是另一種對映方式,或者可以說它是NHibernate標準XML對映檔案的替代方案。它無需編寫XML(.hbm.xml檔案)文件。藉助流暢的NHibernate,您可以使用強型別C#程式碼編寫對映。

  • 在流暢的NHibernate中,對映與應用程式的其餘部分一起編譯。

  • 您可以像修改應用程式程式碼一樣輕鬆更改對映,編譯器會報錯任何拼寫錯誤。

  • 它具有傳統的配置系統,您可以在其中指定用於覆蓋命名約定和許多其他事物的模式。

  • 您也可以一次設定命名方式,然後流暢的NHibernate完成其餘工作。

讓我們來看一個簡單的示例,建立一個新的控制檯專案。本章將使用一個簡單的資料庫,其中包含一個簡單的客戶表,如下面的圖片所示。

Simple Customer Table

安裝Fluent NHibernate

第一步是開始使用Fluent NHibernate,安裝Fluent NHibernate包。因此,開啟**NuGet程式包管理器控制檯**並輸入以下命令。

PM> install-package FluentNHibernate

成功安裝後,您將看到以下訊息。

Installed Successfully

讓我們新增一個簡單的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 + "\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個客戶。

Customer Record
廣告
© . All rights reserved.