NHibernate - Hồ sơ

Trong chương này, chúng ta sẽ hiểu cách tất cả các bản ghi từ cơ sở dữ liệu retrieved, updated, created, and deleted và chính xác thì những truy vấn này được thực hiện như thế nào?

Để hiểu tất cả những điều này, chúng ta có thể chỉ cần thêm một tùy chọn vào cấu hình của mình, tùy chọn này ghi SQL trong bảng điều khiển. Đây là câu lệnh đơn giản sẽ ghi lại truy vấn SQL -

x.LogSqlInConsole = true;

Bây giờ, chúng tôi có hai bản ghi trong bảng sinh viên của chúng tôi trong cơ sở dữ liệu NHibernateDemoDB. Hãy lấy tất cả các bản ghi từ cơ sở dữ liệu như được hiển thị trong đoạn mã sau.

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) { 
         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()) { 
               Console.WriteLine("\nFetch the complete list again\n");
               var students = session.CreateCriteria<Student>().List<Student>(); 
      
               foreach (var student in students) { 
                  Console.WriteLine("{0} \t{1} \t{2}", student.ID, student.FirstMidName,
                     student.LastName); 
               } 
               
               tx.Commit(); 
            } 
				
            Console.ReadLine(); 
         } 
      } 
   } 
}

Vì vậy, hãy tiếp tục và chạy lại ứng dụng này, và bạn sẽ thấy kết quả sau:

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

Như bạn có thể thấy, select clauseđược gửi đến cơ sở dữ liệu, nó thực sự giống như mệnh đề sẽ truy xuất ID, FirstMidName và LastName. Vì vậy, tất cả điều này đang được gửi đến cơ sở dữ liệu và xử lý ở đó thay vì có nhiều bản ghi được đưa trở lại máy chủ của bạn và xử lý ở phía máy chủ.

Hồ sơ NHibernate

Một cách khác để xem các kết quả này là sử dụng NHibernate Profiler. NHibernate Profiler là một công cụ thương mại, nhưng nó có rất hữu ích để làm việc với các ứng dụng NHibernate hay không. Bạn có thể dễ dàng cài đặt NHibernate Profiler vào ứng dụng của mình từ NuGet.

Hãy đi tới bảng điều khiển NuGet Manager từ menu Tools bằng cách chọn NuGet Package Manager → Package Manager Console. Nó sẽ mở ra cửa sổ Bảng điều khiển Trình quản lý Gói. Nhập lệnh sau và nhấn enter.

PM> install-package NHibernateProfiler

Nó sẽ cài đặt tất cả các mã nhị phân cần thiết cho NHibernate Profiler, khi nó được cài đặt thành công, bạn sẽ thấy thông báo sau.

Bạn cũng sẽ thấy rằng NHibernate Profiler được khởi chạy sau khi nó được cài đặt. Nó sẽ yêu cầu giấy phép để sử dụng nó, nhưng với mục đích demo, chúng tôi có thể sử dụng phiên bản dùng thử 30 ngày của NHibernate Profiler.

Giờ đây, NHibernate Profiler được tối ưu hóa để hoạt động với các ứng dụng web và bạn sẽ thấy rằng nó đã thêm App_Start foldertrong trình khám phá giải pháp. Để giữ cho tất cả những điều này đơn giản, hãy xóa thư mục App_Start và bạn cũng sẽ thấy rằng một câu lệnh được thêm vào đầu phương thức Main trong lớp Chương trình.

App_Start.NHibernateProfilerBootstrapper.PreStart();

Xóa câu lệnh này cũng như chỉ thêm một cuộc gọi đơn giản NHibernateProfiler.Initialize như được hiển thị trong đoạn mã sau.

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.FirstMidName,
                     student.LastName); 
               } 
					
               tx.Commit(); 
            } 
				
            Console.ReadLine(); 
         } 
      } 
   
   }
}

Bây giờ khi bạn chạy ứng dụng, nó sẽ gửi dữ liệu đến ứng dụng NHibernate Profiler.

Bạn có thể thấy ở đây, chúng tôi có một màn hình hiển thị đẹp cho thấy rằng chúng tôi đã bắt đầu giao dịch, những gì SQL đang làm với cơ sở dữ liệu ở một định dạng đẹp.

Vì vậy, điều này rất hữu ích để xác định chính xác những gì đang xảy ra bên trong ứng dụng NHibernate của bạn. Nó trở nên cực kỳ hữu ích khi ứng dụng đạt đến một mức độ phức tạp nhất định, nơi bạn cần một cái gì đó giống như SQL Profiler, nhưng với kiến ​​thức về NHibernate.