NHibernate - Cấu hình ghi đè

Trong chương này, chúng tôi sẽ trình bày cách ghi đè cấu hình NHibernate. Chỉ có một số điều bạn cần ghi nhớ.

  • Trước hết, cấu hình trong NHibernate là phụ gia.

  • Vì vậy, bạn không chỉ phải sử dụng một tệp xml duy nhất hoặc bạn không chỉ phải sử dụng cấu hình dựa trên mã hoặc NHibernate thông thạo.

  • Bạn có thể trộn và kết hợp tất cả các phương pháp này tùy thuộc vào cách bạn muốn định cấu hình ứng dụng của mình.

  • Điểm quan trọng cần nhớ là cấu hình cuối cùng sẽ thắng.

Trong ví dụ sau, bạn có thể thấy rằng chúng tôi tạo đối tượng cấu hình của mình, định cấu hình nó bằng cấu hình dựa trên mã và cuối cùng gọi cfg.configure() phương thức này tải tệp hibernate.cfg.xml.

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.Configure();
  • Vì vậy, bất kỳ thứ gì bên trong hibernate.cfg.xml đều ghi đè cài đặt được đặt bởi cấu hình dựa trên mã.

  • Bằng cách đảo ngược hai quy trình này, chúng ta có thể có các giá trị mặc định bên trong hibernate.cfg.xml và sau đó thực hiện ghi đè bên trong cấu hình dựa trên mã.

  • Không có gì loại trừ nếu bạn đang sử dụng cấu hình dựa trên mã và cũng không có gì ngăn cản bạn sử dụng tệp hibernate.cfg.xml.

Hãy xem một ví dụ đơn giản, trong đó chúng ta sẽ ghi đè cấu hình bằng cách sử dụng hỗn hợp cấu hình dựa trên xml và dựa trên mã.

Hãy cũng di chuyển chuỗi kết nối đến app.config tệp bằng cách sử dụng mã sau.

<?xml version = "1.0" encoding = "utf-8" ?> 

<configuration> 
   
   <startup> 
      <supportedRuntime version = "v4.0" sku = ".NETFramework,Version = v4.5" /> 
   </startup> 
   
   <connectionStrings> 
      <add name = "default" connectionString = "Data Source =
         asia13797\\sqlexpress;
         Initial Catalog = NHibernateDemoDB;
         Integrated Security = True;
         Connect Timeout = 15;
         Encrypt = False;
         TrustServerCertificate = False;
         ApplicationIntent = ReadWrite;
         MultiSubnetFailover = False"/> 
   </connectionStrings> 

</configuration>

Chuỗi kết nối đang ở một số app.configtệp có tên mặc định. Bây giờ, chúng ta cần đề cập đến tên mặc định trong tệp hibernate.cfg.xml thay vì chuỗi kết nối.

<?xml version = "1.0" encoding = "utf-8" ?> 
<hibernate-configuration xmlns = "urn:nhibernate-configuration-2.2"> 

   <session-factory> 
      <property name = "connection.connection_string">default</property> 
		
      <property name = "connection.driver_class">
         NHibernate.Driver.SqlClientDriver
      </property> 
		
      <property name = "dialect">
         NHibernate.Dialect.MsSql2008Dialect
      </property> 
		
      <mapping assembly = "NHibernateDemoApp"/> 
   </session-factory> 

</hibernate-configuration>

Hãy nhận xét về phần chuỗi kết nối, trình điều khiển và phần phương ngữ từ cấu hình dựa trên mã, vì chương trình sẽ đọc nó từ tệp hibernate.cfg.xml và LogSqlInConsole một phần sẽ vẫn ở trong cấu hình dựa trên mã.

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.Configure(); 
         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} \t{3}", student.ID,
                  student.FirstName, student.LastName, student.AcademicStanding); 
               } 
					
               tx.Commit(); 
            }
				
            Console.ReadLine(); 
         } 
      } 
   } 
}

Bây giờ khi bạn chạy ứng dụng, bạn sẽ thấy rằng chương trình đã đọc nhật ký từ cấu hình dựa trên mã và cấu hình khác từ tệp hibernate.cfg.xml.

NHibernate: SELECT this_.ID as ID0_0_, this_.LastName as LastName0_0_,   
   this_.FirstMidName as FirstMid3_0_0_, this_.AcademicStanding as Academic4_0_0_ FROM
   Student this_

Fetch the complete list again
1 Allan Bommer Excellent
2 Jerry Lewis Good

Vì vậy, bây giờ chúng tôi đã có một số cấu hình bên trong hibernate.cfg.xml , một số trong số đó nằm bên trong cấu hình dựa trên mã và tùy thuộc vào thứ tự gọi dựa trên mã so với configure(), chúng ta có thể thay đổi cái nào trong số chúng sẽ ghi đè cái khác.