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 ที่มีอยู่

  • นั่นเป็นเหตุผลที่เราใช้ส่วนประกอบตรงนี้

  • สิ่งนี้ช่วยให้มีความยืดหยุ่นอย่างมากในการเปลี่ยนเลเยอร์คลาสของเราการกำหนดคลาสของเราเทียบกับวิธีการจัดวางฐานข้อมูลของเรา