NHibernate - การแมปประเภทข้อมูล
ในบทนี้เราจะกล่าวถึงประเภทข้อมูลการทำแผนที่ การแม็พเอนทิตีนั้นตรงไปตรงมาคลาสเอนทิตีมักจะแมปกับตารางฐานข้อมูลโดยใช้<class>, <subclass>, and <joined-subclass>องค์ประกอบการทำแผนที่ ประเภทค่าจำเป็นต้องมีอะไรเพิ่มเติมซึ่งเป็นที่ที่ต้องมีประเภทการแมป
NHibernate สามารถแมปข้อมูลได้หลากหลายประเภท นี่คือรายการประเภทข้อมูลทั่วไปที่รองรับ
ประเภทการทำแผนที่ | ประเภท. NET | System.Data.DbType |
---|---|---|
Int16 | System.Int16 | DbType.Int16 |
Int32 | System.Int32 | DbType.Int32 |
Int64 | System.Int64 | DbType.Int64 |
โสด | ระบบ | DbType. เดี่ยว |
สองเท่า | System.Double | DbType สองเท่า |
ทศนิยม | ระบบทศนิยม | DbType ทศนิยม |
สตริง | System.String | DbType.String |
AnsiString | System.String | DbType.AnsiString |
ไบต์ | ระบบไบต์ | DbType Byte |
ถ่าน | System.Char | DbType.StringFixedLength - หนึ่งอักขระ |
AnsiChar | System.Char | DbType.AnsiStringFixedLength - หนึ่งอักขระ |
บูลีน | ระบบบูลีน | DbType.Boolean |
คำแนะนำ | System.Guid | DbType.Guid |
PersistentEnum | System.Enum (การแจงนับ) | DbType สำหรับค่าพื้นฐาน |
ถูกผิด | ระบบบูลีน | DbType.AnsiStringFixedLength - 'T' หรือ 'F' |
ใช่ไม่ใช่ | ระบบบูลีน | DbType.AnsiStringFixedLength - 'Y' หรือ 'N' |
วันเวลา | วันเวลา | DbType.DateTime - ละเว้นมิลลิวินาที |
เห็บ | System.DateTime | DbType.Int64 |
ช่วงเวลา | System.TimeSpan | DbType.Int64 |
การประทับเวลา | System.DateTime | DbType.DateTime ตามที่ฐานข้อมูลรองรับ |
ไบนารี่ | ระบบไบต์ [] | DbType ไบนารี |
BinaryBlob | ระบบไบต์ [] | DbType ไบนารี |
StringClob | System.String | DbType.String |
ต่อเนื่องได้ | System.Object ใด ๆ ที่มีเครื่องหมาย SerializableAttribute | DbType ไบนารี |
CultureInfo | System.Globalization.CultureInfo | DbType.String - อักขระห้าตัวสำหรับวัฒนธรรม |
ประเภท | System.Type | DbType. สตริงที่ถือชื่อ Assembly Qualified Name |
ตารางที่ระบุข้างต้นอธิบายรายละเอียดของคำแนะนำที่กล่าวถึงด้านล่าง
ทุกอย่างตั้งแต่ประเภทตัวเลขธรรมดาไปจนถึงสตริงซึ่งสามารถแมปได้หลายวิธีโดยใช้ varchars, chars ฯลฯ เช่นเดียวกับกลุ่มสตริงและประเภทต่างๆทั้งหมดที่ฐานข้อมูลรองรับ
มันยังสามารถที่จะทำแผนที่ Booleansทั้งในฟิลด์ที่ใช้เลขศูนย์และฟิลด์อักขระที่ประกอบด้วยจริงเท็จหรือ T และ F
มีหลายวิธีในการกำหนดวิธีการแมปกับส่วนหลังค่าบูลีนในฐานข้อมูล
เราสามารถจัดการการทำแผนที่ของ DateTimeทั้งรวมและไม่รวมออฟเซ็ตเขตเวลาเวลาออมแสง ฯลฯ
เราสามารถทำแผนที่ได้ด้วย enumerations; เราสามารถแมปสิ่งเหล่านี้กับสตริงหรือกับค่าตัวเลขพื้นฐาน
มาดูตัวอย่างง่ายๆที่เรามีชื่อคุณสมบัติเหมือนกันทั้งในฐานข้อมูลและในคลาสนักเรียน
ตอนนี้เรามาเปลี่ยน FirstMidName เป็น FirstName ในชั้นเรียนโดยที่เราจะไม่เปลี่ยนคอลัมน์ FirstMidName แต่เราจะดูวิธีบอกให้ NHibernate ทราบเพื่อดำเนินการแปลงนี้ ต่อไปนี้เป็นชั้นเรียนของนักเรียนที่อัปเดต
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; }
}
}
นี่คือการนำไฟล์การแมป 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>
ในตัวอย่างนี้สมมติว่าฟิลด์ FirstName เป็นสตริง. NET และคอลัมน์ FirstMidName คือ SQL nvarchar. ตอนนี้เพื่อบอก NHibernate ถึงวิธีการแปลงนี้ให้ตั้งชื่อให้เท่ากับFirstName และคอลัมน์เท่ากับ FirstMidName และระบุประเภทการแมปเท่ากับ String ซึ่งเหมาะสมสำหรับการแปลงนี้โดยเฉพาะ
ต่อไปนี้คือไฟล์ Program.cs การใช้งานไฟล์
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();
}
}
}
}
ตอนนี้เมื่อคุณเรียกใช้แอปพลิเคชันของคุณคุณจะเห็นผลลัพธ์ต่อไปนี้
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
ดังที่คุณเห็นว่ามีการแมปชื่อคุณสมบัติอื่นกับชื่อคอลัมน์ในฐานข้อมูล
ลองมาดูตัวอย่างอื่นที่เราจะเพิ่มคุณสมบัติอื่นในคลาสนักเรียนของ enumชนิด. นี่คือการใช้งานชั้นเรียนของนักเรียน
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
}
}
ดังที่คุณจะเห็นว่าการแจงนับมีค่าต่างๆที่แตกต่างกันซึ่งอาจมีได้เช่นดีเยี่ยมดีพอใช้แย่และแย่มาก
เมื่อข้ามไปที่ไฟล์การแมปคุณจะเห็นว่าคุณสมบัติเหล่านี้แต่ละรายการแสดงอยู่ในไฟล์การแมปรวมถึงคุณสมบัติที่เพิ่มใหม่ AcademicStanding ทรัพย์สิน.
<?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>
ตอนนี้เราต้องเปลี่ยนฐานข้อมูลด้วยเช่นกันดังนั้นไปที่ SQL Server Object Explorer แล้วคลิกขวาที่ฐานข้อมูลแล้วเลือกตัวเลือก New Query …
มันจะเปิดตัวแก้ไขแบบสอบถามจากนั้นระบุแบบสอบถามด้านล่าง
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)
);
แบบสอบถามนี้จะทิ้งตารางนักเรียนที่มีอยู่ก่อนแล้วจึงสร้างตารางใหม่
Clcik บนไอคอน Execute ตามที่แสดงด้านบน เมื่อดำเนินการค้นหาสำเร็จแล้วคุณจะเห็นข้อความ
ขยายฐานข้อมูลและตารางแบบเลื่อนลงจากนั้นคลิกขวาที่ตารางนักเรียนแล้วเลือกดูตัวออกแบบ
ตอนนี้คุณจะเห็นตารางที่สร้างขึ้นใหม่ซึ่งมีคุณสมบัติใหม่ AcademicStanding
ลองเพิ่มสองระเบียนตามที่แสดงต่อไปนี้ Program.cs ไฟล์.
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();
}
}
}
}
ตอนนี้ให้เรียกใช้แอปพลิเคชันของคุณและคุณจะเห็นผลลัพธ์ต่อไปนี้บนหน้าต่างคอนโซลของคุณ
Fetch the complete list again
1 Allan Bommer Excellent
2 Jerry Lewis Good
ตอนนี้เรามาดูฐานข้อมูลโดยคลิกขวาที่ Student Table
เลือกดูข้อมูลและคุณจะเห็นทั้งสองระเบียนในตารางนักเรียนดังที่แสดงในภาพหน้าจอต่อไปนี้
คุณจะเห็นว่ามีการเพิ่มระเบียนสองระเบียนและ Allan มี AcademicStanding 0 และ Jerry มี AcademicStanding 1 เนื่องจากใน. Net ค่าการแจงนับแรกโดยค่าเริ่มต้นคือ 0 ซึ่งเป็นค่าที่ยอดเยี่ยมหากคุณดูที่ StudentAcademicStanding. ในขณะที่ในไฟล์ Student.cs Good เป็นไฟล์ที่สองดังนั้นจึงมีค่าเป็น 1