Учебники

NHibernate — переопределить конфигурацию

В этой главе мы рассмотрим, как переопределить конфигурацию NHibernate. Есть только несколько вещей, которые вы должны иметь в виду.

  • Прежде всего, конфигурация в NHibernate является аддитивной.

  • Таким образом, вам не нужно просто использовать один XML-файл, или вам не нужно просто использовать конфигурацию на основе кода или свободный NHibernate.

  • Вы можете смешивать и сочетать все эти методы в зависимости от того, как вы хотите настроить приложение.

  • Важно помнить, что, наконец, конфигурация выигрывает.

Прежде всего, конфигурация в NHibernate является аддитивной.

Таким образом, вам не нужно просто использовать один XML-файл, или вам не нужно просто использовать конфигурацию на основе кода или свободный NHibernate.

Вы можете смешивать и сочетать все эти методы в зависимости от того, как вы хотите настроить приложение.

Важно помнить, что, наконец, конфигурация выигрывает.

В следующем примере вы видите, что мы создаем наш объект конфигурации, настраиваем его с помощью конфигурации на основе кода и, наконец, вызываем метод cfg.configure () , который загружает файл 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();
  • Таким образом, все, что находится внутри файла hibernate.cfg.xml, переопределяет параметры, установленные конфигурацией на основе кода.

  • Путем изменения этих двух процессов мы можем получить значения по умолчанию внутри hibernate.cfg.xml, а затем выполнить наши переопределения внутри конфигурации на основе кода.

  • Ничто не исключает, если вы используете конфигурацию на основе кода, а также ничто не мешает вам использовать файл hibernate.cfg.xml.

Таким образом, все, что находится внутри файла hibernate.cfg.xml, переопределяет параметры, установленные конфигурацией на основе кода.

Путем изменения этих двух процессов мы можем получить значения по умолчанию внутри hibernate.cfg.xml, а затем выполнить наши переопределения внутри конфигурации на основе кода.

Ничто не исключает, если вы используете конфигурацию на основе кода, а также ничто не мешает вам использовать файл hibernate.cfg.xml.

Давайте рассмотрим простой пример, в котором мы переопределим конфигурацию, используя комбинацию конфигурации на основе xml и кода.

Давайте также переместим строку подключения в файл app.config, используя следующий код.

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

Строка подключения находится в каком-то файле app.config с именем по умолчанию. Теперь нам нужно упомянуть имя по умолчанию в файле hibernate.cfg.xml вместо строки подключения.

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

Давайте прокомментируем часть строки подключения, драйвер и часть диалекта из конфигурации на основе кода, поскольку программа будет считывать ее из файла hibernate.cfg.xml, а часть LogSqlInConsole останется в конфигурации на основе кода.

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

Теперь, когда вы запустите приложение, вы увидите, что программа прочитала журнал из конфигурации на основе кода и другую конфигурацию из файла 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

Итак, теперь у нас есть некоторые наши настройки внутри нашего файла hibernate.cfg.xml , некоторые из них находятся внутри конфигурации на основе кода, и в зависимости от порядка вызова на основе кода в сравнении с configure () , мы можем изменить, какой из они перекрывают другие.