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