NHibernate - Eşleme Bileşeni

Bu bölümde, haritalama bileşenlerinden bahsedeceğiz. NHibernate'de,component is a value object. Kendine ait bir kimliği yoktur.

  • Bunun bir örneği bir para nesnesi olabilir, bir cüzdan veya bir cüzdan içinde para olabilir, ancak bu paranın tam kimliği önemsizdir.

  • Kendi birincil anahtarı yoktur, ancak bileşenlerin kendileri, sahip olan nesneyle aynı tabloda kalıcıdır.

Basit bir örneğe bakalım, bir öğrencinin adresi olan, bu da bir nesne Location class ile ilişkili.

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

Şimdi, aşağıdaki sorguyu çalıştırarak veritabanını da güncellememiz gerekiyor, bu önce Öğrenci tablosunu bırakacak ve ardından Location sınıfı için bir sütun da içerecek yeni bir tablo oluşturacak.

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) 

);

Şimdi doğrudan Student sınıfının bir parçası olmayan, ancak bunlar Location sınıfının özellikleridir ve Location sınıf nesnesi öğrenci sınıfında tanımlanır. Doğru haritalamak için bir bileşene ihtiyacımız var. Bir bileşen oluşturalımstudent.hbm.xml dosya aşağıdaki kodda gösterildiği gibi.

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

Bu bileşen Adrestir ve üzerinde bu farklı özelliklere sahiptir. Bu bilgilerle, NHibernate artık bunu haritalayabilecek kadar yeterli.

Şimdi burada, yeni bir öğrenci nesnesinin oluşturulup başlatıldığı ve ardından veritabanına kaydedildiği Program.cs dosyası var. Daha sonra listeyi veritabanından alacaktır.

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

Şimdi bu uygulamayı çalıştırabiliriz ve NHibernate bu değerleri veri tabanına kaydedebilir. Uygulamayı çalıştırdığınızda aşağıdaki çıktıyı göreceksiniz.

Fetch the complete list again

2 Allan Bommer Poor 123 Street Lahore Punjab Pakistan

İşte veri tabanındaki değerler.

Bileşenler, bir veritabanı tablosundaki sütunları kendi ayrı sınıflarına ayırmamızı sağlar.

  • Burada dikkat edilmesi gereken diğer husus, Konumun bir sınıf olması, bir varlık olmamasıdır.

  • Değer türü bir nesnedir ve kendi birincil anahtarı yoktur.

  • İçerdiği Öğrenci ile aynı tabloya kaydedilir.

  • Bu nedenle burada bileşeni kullanıyoruz.

  • Bu, sınıf katmanımızı, sınıflarımızın nasıl tanımlandığına karşı veritabanımızın nasıl düzenlendiğini değiştirmek için büyük bir esneklik sağlar.