NHibernate - Komponen Pemetaan

Pada bab ini, kita akan berbicara tentang komponen pemetaan. Di NHibernate,component is a value object. Itu tidak memiliki identitasnya sendiri.

  • Contohnya adalah benda uang, dompet atau dompet mungkin berisi uang di dalamnya, tetapi identitas pasti dari uang itu tidak relevan.

  • Itu tidak memiliki kunci utama sendiri, tetapi komponen itu sendiri tetap ada dalam tabel yang sama dengan objek pemilik.

Mari kita lihat contoh sederhana di mana seorang siswa memiliki Alamat, yang merupakan objek Location class terkait dengannya.

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 
   } 
}

Sekarang, kita juga perlu mengupdate database dengan mengeksekusi query berikut, yang akan menjatuhkan tabel Student terlebih dahulu dan kemudian membuat tabel baru yang juga akan berisi kolom untuk class 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) 

);

Sekarang untuk memetakan kolom-kolom yang tidak secara langsung menjadi bagian dari kelas siswa, tetapi mereka adalah properti kelas Lokasi dan objek kelas Lokasi didefinisikan di kelas siswa. Kami membutuhkan komponen untuk memetakannya dengan benar. Mari buat komponen distudent.hbm.xml file seperti yang ditunjukkan pada kode berikut.

<?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>

Komponen ini adalah Address dan memiliki properti berbeda di atasnya. Dengan informasi ini, NHibernate sekarang memiliki cukup informasi sehingga dapat benar-benar memetakannya.

Sekarang di sini adalah file Program.cs di mana objek siswa baru dibuat dan diinisialisasi dan kemudian disimpan ke database. Ini kemudian akan mengambil daftar dari database.

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(); 
         } 
      }
   } 
}

Sekarang kita dapat menjalankan aplikasi ini dan NHibernate dapat menyimpan nilai tersebut ke database. Saat Anda menjalankan aplikasi, Anda akan melihat output berikut.

Fetch the complete list again

2 Allan Bommer Poor 123 Street Lahore Punjab Pakistan

Berikut adalah nilai-nilai dalam database.

Komponen memungkinkan kita untuk memisahkan kolom yang ada dalam tabel database ke dalam kelasnya sendiri yang terpisah.

  • Hal lain yang perlu diperhatikan di sini adalah karena Lokasi adalah kelas, bukan entitas.

  • Ini adalah objek tipe nilai dan tidak memiliki kunci utama sendiri.

  • Itu disimpan dalam tabel yang sama dengan Siswa yang berisi itu.

  • Itulah mengapa kami menggunakan komponen di sini.

  • Hal ini memungkinkan banyak fleksibilitas untuk mengubah lapisan kelas kita, bagaimana kelas kita didefinisikan versus bagaimana database kita ditata.