NHibernate - Configuración de anulación
En este capítulo, cubriremos cómo anular la configuración de NHibernate. Hay algunas cosas que debe tener en cuenta.
En primer lugar, la configuración en NHibernate es aditiva.
Por lo tanto, no solo tiene que usar un solo archivo xml o no solo tiene que usar la configuración basada en código o NHibernate fluido.
Puede mezclar y combinar todos estos métodos dependiendo de cómo desee configurar su aplicación.
El punto importante a recordar es que, finalmente, la configuración gana.
En el siguiente ejemplo, puede ver que creamos nuestro objeto de configuración, lo configuramos usando la configuración basada en código y finalmente llamamos al cfg.configure() , que carga el archivo 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();
Entonces, cualquier cosa dentro de un hibernate.cfg.xml anula la configuración establecida por la configuración basada en código.
Al invertir estos dos procesos, podemos tener los valores predeterminados dentro de hibernate.cfg.xml y luego hacer nuestras anulaciones dentro de una configuración basada en código.
No hay nada que excluya si está utilizando una configuración basada en código y tampoco hay nada que le impida utilizar el archivo hibernate.cfg.xml.
Echemos un vistazo a un ejemplo simple en el que anularemos la configuración utilizando una combinación de configuración basada en código y xml.
Muevamos también la cadena de conexión al app.config archivo usando el siguiente código.
<?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>
La cadena de conexión se encuentra en algunos app.configarchivo con un nombre predeterminado. Ahora, debemos mencionar el nombre predeterminado en el archivo hibernate.cfg.xml en lugar de la cadena de conexión.
<?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>
Comentemos la parte de la cadena de conexión, el controlador y la parte del dialecto de la configuración basada en código, porque el programa lo leerá del archivo hibernate.cfg.xml y el LogSqlInConsole parte permanecerá en la configuración basada en código.
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();
}
}
}
}
Ahora, cuando ejecute la aplicación, verá que el programa ha leído el registro de la configuración basada en código y otra configuración del archivo 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
Así que ahora tenemos parte de nuestra configuración dentro de nuestro hibernate.cfg.xml archivo, parte de él está dentro de la configuración basada en código y dependiendo del orden de llamada basada en código versus configure(), podemos cambiar cuál de ellos anula al otro.