NHibernate - Pemetaan Jenis Data

Dalam bab ini, kita akan membahas tipe data pemetaan. Memetakan entitas sangat mudah, kelas entitas selalu dipetakan ke tabel database menggunakan<class>, <subclass>, and <joined-subclass>elemen pemetaan. Tipe nilai membutuhkan sesuatu yang lebih, dimana tipe pemetaan dibutuhkan.

NHibernate mampu memetakan berbagai jenis data. Berikut adalah daftar tipe data paling umum yang didukung.

Jenis pemetaan Tipe .NET System.Data.DbType
Int16 System.Int16 DbType.Int16
Int32 System.Int32 DbType.Int32
Int64 System.Int64 DbType.Int64
Tunggal System.Single DbType.Single
Dua kali lipat Sistem. Ganda DbType.Double
Desimal Sistem Desimal DbType.Decimal
Tali System.String DbType.String
AnsiString System.String DbType.AnsiString
Byte System.Byte DbType.Byte
Arang System.Char DbType.StringFixedLength — satu karakter
AnsiChar System.Char DbType.AnsiStringFixedLength — satu karakter
Boolean System.Boolean DbType.Boolean
Guid System.Guid DbType.Guid
PersistentEnum System.Enum (enumerasi) DbType untuk nilai yang mendasari
Benar salah System.Boolean DbType.AnsiStringFixedLength — baik 'T' atau 'F'
Ya Tidak System.Boolean DbType.AnsiStringFixedLength — baik 'Y' atau 'N'
Tanggal Waktu Tanggal Waktu DbType.DateTime — mengabaikan milidetik
Kutu System.DateTime DbType.Int64
Rentang waktu System.TimeSpan DbType.Int64
Stempel waktu System.DateTime DbType.DateTime — sespesifik yang didukung database
Biner System.Byte [] DbType.Binary
BinaryBlob System.Byte [] DbType.Binary
StringClob System.String DbType.String
Dapat diserialkan Setiap System.Object ditandai dengan SerializableAttribute DbType.Binary
CultureInfo System.Globalization.CultureInfo DbType.String — lima karakter untuk budaya
Tipe Tipe sistem DbType.String memegang Assembly Qualified Name

Tabel yang diberikan di atas menjelaskan secara rinci petunjuk yang disebutkan di bawah ini.

  • Semuanya, mulai dari tipe numerik sederhana hingga string, yang dapat dipetakan dalam berbagai cara menggunakan varchars, chars dll serta gumpalan string dan semua jenis yang didukung database.

  • Itu juga bisa memetakan Booleans, untuk bidang yang menggunakan angka nol dan satu, bidang karakter yang berisi benar, salah atau T dan F.

  • Ada berbagai cara untuk menentukan bagaimana peta itu ke ujung belakang, nilai-nilai boolean dalam database.

  • Kami dapat menangani pemetaan DateTime, baik termasuk dan tidak termasuk offset zona waktu, waktu musim panas, dll.

  • Kami juga bisa memetakan enumerations; kita bisa memetakannya ke string atau ke nilai numerik yang mendasarinya.

Mari kita lihat contoh sederhana di mana kita memiliki nama properti yang sama baik di database maupun di kelas Student.

Sekarang mari kita ubah FirstMidName menjadi FirstName di kelas siswa, di mana kita tidak akan mengubah kolom FirstMidName, tapi kita akan melihat bagaimana memberi tahu NHibernate untuk melakukan konversi ini. Berikut adalah kelas siswa yang diperbarui.

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

Berikut adalah implementasi file pemetaan 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>

Dalam contoh ini, asumsikan bahwa bidang FirstName adalah string .NET, dan kolom FirstMidName adalah SQL nvarchar. Sekarang untuk memberi tahu NHibernate bagaimana melakukan konversi ini, setel nama sama denganFirstName dan kolom sama dengan FirstMidName dan tentukan jenis pemetaan yang sama dengan String, yang sesuai untuk konversi khusus ini.

Berikut ini adalah a Program.cs implementasi file.

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

Sekarang ketika Anda menjalankan aplikasi Anda, Anda akan melihat output berikut.

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

Seperti yang Anda lihat bahwa ini telah memetakan nama properti yang berbeda ke nama kolom dalam database.

Mari kita lihat contoh lain di mana kita akan menambahkan properti lain di kelas Student enumTipe. Berikut adalah implementasi kelas siswa.

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

Seperti yang Anda lihat, pencacahan memiliki berbagai nilai berbeda yang mungkin dimilikinya seperti, Sangat Baik, Baik, Cukup, Buruk dan Buruk.

Melompat ke file pemetaan, Anda dapat melihat bahwa setiap properti ini terdaftar di file pemetaan termasuk yang baru ditambahkan AcademicStanding Properti.

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

Sekarang kita juga perlu mengubah database juga, jadi buka SQL Server Object Explorer dan klik kanan pada database dan pilih opsi New Query….

Ini akan membuka editor kueri dan kemudian menentukan kueri di bawah ini.

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

Kueri ini pertama-tama akan menjatuhkan tabel siswa yang ada dan kemudian membuat tabel baru.

Klik ikon Execute seperti yang ditunjukkan di atas. Setelah kueri berhasil dieksekusi, Anda akan melihat pesan.

Perluas database dan dropdown Tabel, lalu klik kanan pada tabel Siswa dan pilih Lihat Desainer.

Sekarang, Anda akan melihat tabel yang baru dibuat, yang juga memiliki properti baru AcademicStanding.

Mari tambahkan dua record seperti yang ditunjukkan berikut ini Program.cs mengajukan.

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

Sekarang mari jalankan aplikasi Anda dan Anda akan melihat output berikut di jendela konsol Anda.

Fetch the complete list again

1 Allan Bommer Excellent
2 Jerry Lewis Good

Sekarang mari kita lihat database dengan mengklik kanan pada Tabel Siswa.

Pilih Lihat Data dan Anda akan melihat dua catatan di tabel siswa seperti yang ditunjukkan pada gambar layar berikut.

Anda dapat melihat bahwa dua record ditambahkan dan Allan memiliki AcademicStanding 0 dan Jerry memiliki AcademicStanding 1. Ini karena di .Net nilai enumerasi pertama secara default memiliki 0, yang merupakan Excellent jika Anda melihat StudentAcademicStanding. Sedangkan pada file Student.cs Good adalah yang kedua, jadi memiliki nilai 1.