NHibernate - ส่วนประกอบการทำแผนที่
ในบทนี้เราจะพูดถึงส่วนประกอบการทำแผนที่ ใน NHibernatecomponent is a value object. มันไม่มีเอกลักษณ์เป็นของตัวเอง
ตัวอย่างของสิ่งนี้จะเป็นวัตถุเงินกระเป๋าเงินหรือกระเป๋าสตางค์อาจมีเงินอยู่ แต่ตัวตนที่แท้จริงของเงินนั้นไม่เกี่ยวข้อง
ไม่มีคีย์หลักของตัวเอง แต่ส่วนประกอบเองยังคงอยู่ในตารางเดียวกันกับออบเจ็กต์ที่เป็นเจ้าของ
มาดูตัวอย่างง่ายๆที่นักเรียนมี Address ซึ่งเป็นวัตถุของ Location class เกี่ยวข้องกับมัน
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 virtual Location Address { get; set; }
}
public class Location {
public virtual string Street { get; set; }
public virtual string City { get; set; }
public virtual string Province { get; set; }
public virtual string Country { get; set; }
}
public enum StudentAcademicStanding {
Excellent,
Good,
Fair,
Poor,
Terrible
}
}
ตอนนี้เราจำเป็นต้องอัปเดตฐานข้อมูลด้วยการเรียกใช้แบบสอบถามต่อไปนี้ซึ่งจะทิ้งตารางนักเรียนก่อนจากนั้นสร้างตารางใหม่ที่จะมีคอลัมน์สำหรับคลาส Location ด้วย
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,
[Street] NVARCHAR (100) NULL,
[City] NVARCHAR (100) NULL,
[Province] NVARCHAR (100) NULL,
[Country] NVARCHAR (100) NULL,
CONSTRAINT [PK_dbo.Student] PRIMARY KEY CLUSTERED ([ID] ASC)
);
ตอนนี้เพื่อแม็พคอลัมน์เหล่านั้นที่ไม่ได้เป็นส่วนหนึ่งของคลาสนักเรียนโดยตรง แต่เป็นคุณสมบัติของคลาส Location และอ็อบเจ็กต์คลาส Location ถูกกำหนดไว้ในคลาสนักเรียน เราจำเป็นต้องมีส่วนประกอบเพื่อทำแผนที่ให้ถูกต้อง มาสร้างส่วนประกอบในstudent.hbm.xml ตามที่แสดงในรหัสต่อไปนี้
<?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"/>
<component name = "Address">
<property name = "Street"/>
<property name = "City"/>
<property name = "Province"/>
<property name = "Country"/>
</component>
</class>
</hibernate-mapping>
ส่วนประกอบนี้เป็นที่อยู่และมีคุณสมบัติที่แตกต่างกันเหล่านี้ ด้วยข้อมูลนี้ตอนนี้ NHibernate มีเพียงพอที่จะทำแผนที่ได้จริง
ตอนนี้นี่คือไฟล์ Program.cs ซึ่งมีการสร้างและเริ่มต้นอ็อบเจ็กต์นักเรียนใหม่จากนั้นบันทึกลงในฐานข้อมูล จากนั้นจะดึงรายการจากฐานข้อมูล
using HibernatingRhinos.Profiler.Appender.NHibernate;
using NHibernate.Cache;
using NHibernate.Caches.SysCache;
using NHibernate.Cfg;
using NHibernate.Dialect;
using NHibernate.Driver;
using NHibernate.Linq;
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.Poor,
Address = new Location {
Street = "123 Street",
City = "Lahore",
Province = "Punjab",
Country = "Pakistan"
}
};
session.Save(student1);
tx.Commit();
var students = session.Query<Student>().ToList<Student>();
Console.WriteLine("\nFetch the complete list again\n");
foreach (var student in students) {
Console.WriteLine("{0} \t{1} \t{2} \t{3} \t{4} \t{5} \t{6} \t{7}",
student.ID,
student.FirstName,
student.LastName,
student.AcademicStanding,
student.Address.Street,
student.Address.City,
student.Address.Province,
student.Address.Country
);
}
}
Console.ReadLine();
}
}
}
}
ตอนนี้เราสามารถเรียกใช้แอปพลิเคชันนี้ได้แล้วและ NHibernate สามารถบันทึกค่าเหล่านั้นลงในฐานข้อมูลได้ เมื่อคุณเรียกใช้แอปพลิเคชันคุณจะเห็นผลลัพธ์ต่อไปนี้
Fetch the complete list again
2 Allan Bommer Poor 123 Street Lahore Punjab Pakistan
นี่คือค่าในฐานข้อมูล
ส่วนประกอบช่วยให้เราสามารถแยกคอลัมน์ที่อยู่ในตารางฐานข้อมูลออกเป็นคลาสแยกต่างหาก
สิ่งอื่นที่ต้องสังเกตคือเนื่องจาก Location เป็นคลาสไม่ใช่เอนทิตี
เป็นวัตถุประเภทค่าและไม่มีคีย์หลักของตัวเอง
จะถูกบันทึกไว้ในตารางเดียวกับ Student ที่มีอยู่
นั่นเป็นเหตุผลที่เราใช้ส่วนประกอบตรงนี้
สิ่งนี้ช่วยให้มีความยืดหยุ่นอย่างมากในการเปลี่ยนเลเยอร์คลาสของเราการกำหนดคลาสของเราเทียบกับวิธีการจัดวางฐานข้อมูลของเรา