NHibernate - Veri Türleri Eşleme

Bu bölümde, haritalama veri türlerini ele alacağız. Varlıkları eşlemek basittir, varlık sınıfları her zaman veritabanı tablolarıyla eşlenir.<class>, <subclass>, and <joined-subclass>eşleme öğeleri. Değer türleri daha fazlasına ihtiyaç duyar, bu da eşleme türlerinin gerekli olduğu yerdir.

NHibernate, çok çeşitli veri türlerini eşleyebilir. Desteklenen en yaygın veri türlerinin listesi aşağıdadır.

Eşleme türü .NET türü System.Data.DbType
Int16 System.Int16 DbType.Int16
Int32 System.Int32 DbType.Int32
Int64 System.Int64 DbType.Int64
Tek System.Single DbType.Single
Çift System.Double DbType.Double
Ondalık System.Decimal DbType.Decimal
Dize System.String DbType.String
AnsiString System.String DbType.AnsiString
Bayt System.Byte DbType.Byte
Char System.Char DbType.StringFixedLength — bir karakter
AnsiChar System.Char DbType.AnsiStringFixedLength — bir karakter
Boole System.Boolean DbType.Boolean
Kılavuz System.Guid DbType.Guid
PersistentEnum System.Enum (bir numaralandırma) Temel değer için DbType
Doğru yanlış System.Boolean DbType.AnsiStringFixedLength - 'T' veya 'F'
Evet Hayır System.Boolean DbType.AnsiStringFixedLength - 'Y' veya 'N'
DateTime DateTime DbType.DateTime — milisaniyeleri dikkate almaz
Keneler System.DateTime DbType.Int64
Zaman aralığı System.TimeSpan DbType.Int64
Zaman damgası System.DateTime DbType.DateTime - veritabanının desteklediği kadar spesifik
İkili System.Byte [] DbType.Binary
BinaryBlob System.Byte [] DbType.Binary
StringClob System.String DbType.String
Serileştirilebilir SerializableAttribute ile işaretlenmiş herhangi bir System.Object DbType.Binary
CultureInfo System.Globalization.CultureInfo DbType.String — kültür için beş karakter
Tür Sistem tipi Derleme Nitelikli Adını tutan DbType.String

Yukarıda verilen tablo, aşağıda belirtilen noktaları ayrıntılı olarak açıklamaktadır.

  • Basit sayısal türlerden, çeşitli şekillerde eşlenebilen dizelere kadar her şey varchars, chars vb. yanı sıra dize blobları ve veritabanlarının desteklediği tüm türler.

  • Ayrıca harita yapabiliyor Booleans, hem sıfır hem de birler kullanan alanlara, doğru, yanlış veya T ve F içeren karakter alanlarına.

  • Veritabanındaki arka uç, boole değerleriyle nasıl eşleştiğini tanımlamanın çok çeşitli yolları vardır.

  • Haritalandırmayı halledebiliriz DateTimesaat dilimi uzaklıkları, gün ışığından yararlanma saati vb. dahil ve hariç

  • Ayrıca haritalayabiliriz enumerations; bunları dizelerle veya onların temelindeki sayısal değerlerle eşleyebiliriz.

Hem veritabanında hem de Öğrenci sınıfında aynı özellik adlarına sahip olduğumuz basit bir örneğe bakalım.

Şimdi öğrenci sınıfında FirstMidName'i FirstName olarak değiştirelim, burada FirstMidName sütununu değiştirmeyeceğiz, ancak NHibernate'e bu dönüşümü gerçekleştireceğini nasıl söyleyeceğimizi göreceğiz. Güncellenen öğrenci sınıfı aşağıdadır.

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 eşleme dosyasının uygulaması burada.

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

Bu örnekte, FirstName alanının bir .NET dizesi ve FirstMidName sütununun bir SQL nvarchar. Şimdi NHibernate'e bu dönüşümü nasıl gerçekleştireceğini söylemek için adı şuna eşit ayarlayın:FirstName ve sütun eşittir FirstMidName ve bu özel dönüştürme için uygun olan, String'e eşit eşleme türünü belirtin.

Aşağıdaki bir Program.cs dosya uygulaması.

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

Şimdi uygulamanızı çalıştırdığınızda aşağıdaki çıktıyı göreceksiniz.

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

Gördüğünüz gibi, farklı özellik adını veritabanındaki sütun adıyla eşlemiş.

Öğrenci sınıfına başka bir özellik ekleyeceğimiz başka bir örneğe bakalım. enumyazın. İşte Öğrenci sınıfı uygulaması.

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

Gördüğünüz gibi numaralandırmanın sahip olabileceği, Mükemmel, İyi, Orta, Zayıf ve Korkunç gibi çeşitli farklı değerleri vardır.

Eşleme dosyasına atladığınızda, bu özelliklerin her birinin yeni eklenenler de dahil olmak üzere eşleme dosyasında listelendiğini görebilirsiniz. AcademicStanding Emlak.

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

Şimdi ayrıca veritabanını da değiştirmemiz gerekiyor, bu yüzden SQL Server Object Explorer'a gidin ve veritabanına sağ tıklayın ve Yeni Sorgu… seçeneğini seçin.

Sorgu düzenleyicisini açacak ve ardından aşağıdaki sorguyu belirleyecektir.

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

Bu sorgu önce mevcut öğrenci tablosunu kaldıracak ve ardından yeni bir tablo oluşturacaktır.

Yukarıda gösterildiği gibi Yürüt simgesine Clcik. Sorgu başarıyla yürütüldüğünde bir mesaj görürsünüz.

Veritabanı ve Tablo açılır menüsünü genişletin ve ardından Öğrenci tablosuna sağ tıklayın ve Tasarımcıyı Görüntüle'yi seçin.

Şimdi, yeni oluşturulmuş ve AcademicStanding özelliğine sahip olan tabloyu göreceksiniz.

Aşağıda gösterildiği gibi iki kayıt ekleyelim Program.cs dosya.

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

Şimdi uygulamanızı çalıştıralım ve konsol pencerenizde aşağıdaki çıktıyı göreceksiniz.

Fetch the complete list again

1 Allan Bommer Excellent
2 Jerry Lewis Good

Şimdi Öğrenci Tablosu'na sağ tıklayarak veri tabanına bakalım.

Verileri Görüntüle'yi seçin ve aşağıdaki ekran görüntüsünde gösterildiği gibi öğrenci tablosunda iki kaydı göreceksiniz.

İki kaydın eklendiğini ve Allan'ın AcademicStanding 0'a ve Jerry'nin AcademicStanding 1'e sahip olduğunu görebilirsiniz. Bunun nedeni, .Net'te varsayılan olarak ilk numaralandırma değerinin 0'a sahip olmasıdır; StudentAcademicStanding. Oysa Student.cs dosyasında İyi ikinci dosyadır, dolayısıyla değeri 1'dir.