NHibernate - Ánh xạ các loại dữ liệu
Trong chương này, chúng ta sẽ đề cập đến các kiểu dữ liệu ánh xạ. Ánh xạ các thực thể rất đơn giản, các lớp thực thể luôn được ánh xạ tới các bảng cơ sở dữ liệu bằng cách sử dụng<class>, <subclass>, and <joined-subclass>các yếu tố ánh xạ. Các loại giá trị cần một cái gì đó nhiều hơn, đó là nơi các loại ánh xạ được yêu cầu.
NHibernate có thể ánh xạ nhiều loại dữ liệu khác nhau. Đây là danh sách các kiểu dữ liệu phổ biến nhất được hỗ trợ.
Loại ánh xạ | Loại .NET | System.Data.DbType |
---|---|---|
Int16 | Hệ thống.Int16 | DbType.Int16 |
Int32 | Hệ thống.Int32 | DbType.Int32 |
Int64 | Hệ thống.Int64 | DbType.Int64 |
Độc thân | System.Single | DbType.Single |
Gấp đôi | Hệ thống. Đôi | DbType.Double |
Thập phân | System.Decimal | DbType.Decimal |
Chuỗi | System.String | DbType.String |
AnsiString | System.String | DbType.AnsiString |
Byte | System.Byte | DbType.Byte |
Char | System.Char | DbType.StringFixedLength — một ký tự |
AnsiChar | System.Char | DbType.AnsiStringFixedLength — một ký tự |
Boolean | System.Boolean | DbType.Boolean |
Hướng dẫn | System.Guid | DbType.Guid |
Kiên trì | System.Enum (một kiểu liệt kê) | DbType cho giá trị cơ bản |
Đúng sai | System.Boolean | DbType.AnsiStringFixedLength — 'T' hoặc 'F' |
Có không | System.Boolean | DbType.AnsiStringFixedLength — 'Y' hoặc 'N' |
Ngày giờ | Ngày giờ | DbType.DateTime — bỏ qua mili giây |
Bọ ve | System.DateTime | DbType.Int64 |
TimeSpan | System.TimeSpan | DbType.Int64 |
Dấu thời gian | System.DateTime | DbType.DateTime — cụ thể như cơ sở dữ liệu hỗ trợ |
Nhị phân | System.Byte [] | DbType.Binary |
BinaryBlob | System.Byte [] | DbType.Binary |
StringClob | System.String | DbType.String |
Serializable | Any System.Object được đánh dấu bằng SerializableAttribute | DbType.Binary |
CultureInfo | System.Globalization.CultureInfo | DbType.String — năm ký tự cho văn hóa |
Kiểu | Loại hệ thống | DbType.String giữ tên hội đủ điều kiện |
Bảng trên giải thích chi tiết các gợi ý được đề cập bên dưới.
Mọi thứ từ các kiểu số đơn giản đến chuỗi, có thể được ánh xạ theo nhiều cách khác nhau bằng cách sử dụng varchars, chars v.v. cũng như các đốm màu chuỗi và tất cả các loại khác nhau mà cơ sở dữ liệu hỗ trợ.
Nó cũng có thể lập bản đồ Booleans, cho cả các trường sử dụng số không và số một, các trường ký tự chứa true, false hoặc T và F.
Có nhiều cách để xác định cách ánh xạ tới back end, các giá trị boolean trong cơ sở dữ liệu.
Chúng tôi có thể xử lý ánh xạ của DateTime, cả bao gồm và không bao gồm lệch múi giờ, giờ tiết kiệm ánh sáng ban ngày, v.v.
Chúng tôi cũng có thể lập bản đồ enumerations; chúng ta có thể ánh xạ chúng thành chuỗi hoặc với các giá trị số cơ bản của chúng.
Hãy xem xét một ví dụ đơn giản trong đó chúng ta có các tên thuộc tính giống nhau cả trong cơ sở dữ liệu cũng như trong lớp Sinh viên.
Bây giờ chúng ta hãy thay đổi FirstMidName thành FirstName trong lớp học sinh, nơi chúng ta sẽ không thay đổi cột FirstMidName, nhưng chúng ta sẽ xem cách thông báo cho NHibernate biết để thực hiện chuyển đổi này. Sau đây là lớp học sinh được cập nhật.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace NHibernateDemoApp {
class Student {
public virtual int ID { get; set; }
public virtual string LastName { get; set; }
public virtual string FirstName { get; set; }
}
}
Đây là việc triển khai tệp ánh xạ NHibernate.
<?xml version = "1.0" encoding = "utf-8" ?>
<hibernate-mapping xmlns = "urn:nhibernate-mapping-2.2" assembly = "NHibernateDemoApp"
namespace = "NHibernateDemoApp">
<class name = "Student">
<id name = "ID">
<generator class = "native"/>
</id>
<property name = "LastName"/>
<property name = "FirstName" column = "FirstMidName" type = "String"/>
</class>
</hibernate-mapping>
Trong ví dụ này, giả sử rằng trường FirstName là một chuỗi .NET và cột FirstMidName là một SQL nvarchar. Bây giờ để cho NHibernate biết cách thực hiện chuyển đổi này, hãy đặt tên bằngFirstName và cột bằng FirstMidName và chỉ định kiểu ánh xạ bằng Chuỗi, thích hợp cho chuyển đổi cụ thể này.
Sau đây là một Program.cs triển khai tệp.
using HibernatingRhinos.Profiler.Appender.NHibernate;
using NHibernate.Cfg;
using NHibernate.Dialect;
using NHibernate.Driver;
using System;
using System.Linq;
using System.Reflection;
namespace NHibernateDemoApp {
class Program {
static void Main(string[] args) {
NHibernateProfiler.Initialize();
var cfg = new Configuration();
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;
cfg.DataBaseIntegration(x = > { x.ConnectionString = "Data Source +
Initial Catalog + Integrated Security + Connect Timeout + Encrypt +
TrustServerCertificate + ApplicationIntent + MultiSubnetFailover";
x.Driver<SqlClientDriver>();
x.Dialect<MsSql2008Dialect>();
x.LogSqlInConsole = true;
});
cfg.AddAssembly(Assembly.GetExecutingAssembly());
var sefact = cfg.BuildSessionFactory();
using (var session = sefact.OpenSession()) {
using (var tx = session.BeginTransaction()) {
var students = session.CreateCriteria<Student>().List<Student>();
Console.WriteLine("\nFetch the complete list again\n");
foreach (var student in students) {
Console.WriteLine("{0} \t{1} \t{2}", student.ID, student.FirstName,
student.LastName);
}
tx.Commit();
}
Console.ReadLine();
}
}
}
}
Bây giờ khi bạn chạy ứng dụng của mình, bạn sẽ thấy kết quả sau.
NHibernate: SELECT this_.ID as ID0_0_, this_.LastName as LastName0_0_,
this_.FirstMidName as FirstMid3_0_0_ FROM Student this_
Fetch the complete list again
3 Allan Bommer
4 Jerry Lewis
Như bạn có thể thấy rằng nó đã ánh xạ tên thuộc tính khác với tên cột trong cơ sở dữ liệu.
Hãy xem một ví dụ khác, trong đó chúng ta sẽ thêm một thuộc tính khác trong lớp Sinh viên của enumkiểu. Đây là phần triển khai lớp Sinh viên.
using System;
using System.Collections.Generic;
using System.Linq; using System.Text;
using System.Threading.Tasks;
namespace NHibernateDemoApp {
class Student {
public virtual int ID { get; set; }
public virtual string LastName { get; set; }
public virtual string FirstName { get; set; }
public virtual StudentAcademicStanding AcademicStanding { get; set; }
}
public enum StudentAcademicStanding {
Excellent,
Good,
Fair,
Poor,
Terrible
}
}
Như bạn có thể thấy rằng phép liệt kê có nhiều giá trị khác nhau mà nó có thể có, chẳng hạn như Tuyệt vời, Tốt, Khá, Kém và Kém.
Chuyển đến tệp ánh xạ, bạn có thể thấy rằng từng thuộc tính này được liệt kê trong tệp ánh xạ bao gồm cả phần mới được thêm vào AcademicStanding bất động sản.
<?xml version = "1.0" encoding = "utf-8" ?>
<hibernate-mapping xmlns = "urn:nhibernate-mapping-2.2"
assembly = "NHibernateDemoApp" namespace = "NHibernateDemoApp">
<class name = "Student">
<id name = "ID">
<generator class = "native"/>
</id>
<property name = "LastName"/>
<property name = "FirstName" column = "FirstMidName" type = "String"/>
<property name = "AcademicStanding"/>
</class>
</hibernate-mapping>
Bây giờ chúng ta cũng cần thay đổi cơ sở dữ liệu, vì vậy hãy chuyển đến SQL Server Object Explorer và nhấp chuột phải vào cơ sở dữ liệu và chọn tùy chọn New Query….
Nó sẽ mở trình soạn thảo truy vấn và sau đó chỉ định truy vấn bên dưới.
DROP TABLE [dbo].[Student]
CREATE TABLE [dbo].[Student] (
[ID] INT IDENTITY (1, 1) NOT NULL,
[LastName] NVARCHAR (MAX) NULL,
[FirstMidName] NVARCHAR (MAX) NULL,
[AcademicStanding] NCHAR(10) NULL,
CONSTRAINT [PK_dbo.Student] PRIMARY KEY CLUSTERED ([ID] ASC)
);
Truy vấn này trước tiên sẽ xóa bảng sinh viên hiện có và sau đó tạo một bảng mới.
Clcik vào biểu tượng Execute như hình trên. Sau khi truy vấn được thực thi thành công thì bạn sẽ thấy một thông báo.
Mở rộng cơ sở dữ liệu và bảng thả xuống, sau đó bấm chuột phải vào bảng Sinh viên và chọn Xem thiết kế.
Bây giờ, bạn sẽ thấy bảng mới được tạo, bảng này cũng có thuộc tính mới là AcademicStanding.
Hãy thêm hai bản ghi như được hiển thị trong phần sau Program.cs tập tin.
using HibernatingRhinos.Profiler.Appender.NHibernate;
using NHibernate.Cfg;
using NHibernate.Dialect;
using NHibernate.Driver;
using System;
using System.Linq;
using System.Reflection;
namespace NHibernateDemoApp {
class Program {
static void Main(string[] args) {
NHibernateProfiler.Initialize();
var cfg = new Configuration();
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;
cfg.DataBaseIntegration(x = > { x.ConnectionString = "Data Source +
Initial Catalog + Integrated Security + Connect Timeout + Encrypt +
TrustServerCertificate + ApplicationIntent + MultiSubnetFailover";
x.Driver<SqlClientDriver>();
x.Dialect<MsSql2008Dialect>();
});
cfg.AddAssembly(Assembly.GetExecutingAssembly());
var sefact = cfg.BuildSessionFactory();
using (var session = sefact.OpenSession()) {
using (var tx = session.BeginTransaction()) {
var student1 = new Student {
ID = 1,
FirstName = "Allan",
LastName = "Bommer",
AcademicStanding = StudentAcademicStanding.Excellent
};
var student2 = new Student {
ID = 2,
FirstName = "Jerry",
LastName = "Lewis",
AcademicStanding = StudentAcademicStanding.Good
};
session.Save(student1);
session.Save(student2);
var students = session.CreateCriteria<Student>().List<Student>();
Console.WriteLine("\nFetch the complete list again\n");
foreach (var student in students) {
Console.WriteLine("{0} \t{1} \t{2} \t{3}", student.ID,
student.FirstName, student.LastName, student.AcademicStanding);
}
tx.Commit();
}
Console.ReadLine();
}
}
}
}
Bây giờ hãy chạy ứng dụng của bạn và bạn sẽ thấy kết quả sau trên cửa sổ bảng điều khiển của bạn.
Fetch the complete list again
1 Allan Bommer Excellent
2 Jerry Lewis Good
Bây giờ chúng ta hãy xem xét cơ sở dữ liệu bằng cách nhấp chuột phải vào Bảng Sinh viên.
Chọn Xem Dữ liệu và bạn sẽ thấy hai bản ghi trong bảng sinh viên như được hiển thị trong ảnh chụp màn hình sau.
Bạn có thể thấy rằng hai bản ghi được thêm vào và Allan có AcademicStanding 0 và Jerry có AcademicStanding 1. Điều này là do trong .Net, giá trị liệt kê đầu tiên theo mặc định có 0, điều này là Tuyệt vời nếu bạn nhìn vào StudentAcademicStanding. Trong khi đó, trong tệp Student.cs Tốt là tệp thứ hai nên nó có giá trị là 1.