NHibernate - Ngủ đông thành thạo
Trong chương này, chúng tôi sẽ trình bày về NHibernate thông thạo. Fluent NHibernate là một cách ánh xạ khác hoặc bạn có thể nói nó là một cách thay thế cho các tệp ánh xạ XML chuẩn của NHibernate. Thay vì viết XML(.hbm.xml files)các tài liệu. Với sự trợ giúp của Fluent NHibernate, bạn có thể viết các ánh xạ bằng mã C # được gõ mạnh.
Trong Fluent NHibernate, các ánh xạ được biên dịch cùng với phần còn lại của ứng dụng của bạn.
Bạn có thể dễ dàng thay đổi ánh xạ của mình giống như mã ứng dụng của bạn và trình biên dịch sẽ không thành công với bất kỳ lỗi chính tả nào.
Nó có một hệ thống cấu hình thông thường, nơi bạn có thể chỉ định các mẫu để ghi đè các quy ước đặt tên và nhiều thứ khác.
Bạn cũng có thể đặt cách mọi thứ nên được đặt tên một lần, sau đó Fluent NHibernate thực hiện phần còn lại.
Hãy xem một ví dụ đơn giản bằng cách tạo một dự án bảng điều khiển mới. Trong chương này, chúng ta sẽ sử dụng một cơ sở dữ liệu đơn giản, trong đó chúng ta có một bảng Khách hàng đơn giản như thể hiện trong hình sau.
Cài đặt Fluent NHibernate
Bước đầu tiên để khởi động Fluent NHibernate là cài đặt gói Fluent NHibernate. Vì vậy, hãy mởNuGet Package Manager Console và nhập lệnh sau.
PM> install-package FluentNHibernate
Sau khi cài đặt thành công, bạn sẽ thấy thông báo sau.
Hãy thêm một lớp mô hình đơn giản của Khách hàng và chương trình sau đây cho thấy việc triển khai lớp Khách hàng.
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; }
}
}
Bây giờ chúng ta cần tạo Ánh xạ bằng NHibernate thông thạo, vì vậy hãy thêm một lớp nữa CustomerMaptrong dự án của bạn. Đây là phần triển khai của lớp 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");
}
}
}
Hãy thêm một lớp khác NHibernateHelper trong đó chúng tôi sẽ thiết lập các cài đặt cấu hình khác nhau.
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();
}
}
}
Bây giờ chúng ta hãy chuyển sang Program.cs trong đó chúng ta sẽ bắt đầu một phiên và sau đó tạo một khách hàng mới và lưu khách hàng đó vào cơ sở dữ liệu như hình dưới đây.
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();
}
}
}
}
Hãy chạy ứng dụng của bạn và bạn sẽ thấy kết quả sau.
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
Như bạn có thể thấy, khách hàng mới đã được tạo. Để xem hồ sơ khách hàng, chúng ta hãy vào cơ sở dữ liệu và xem Dữ liệu xem và bạn sẽ thấy rằng 1 Khách hàng được thêm vào.