NHibernate - Substituir configuração
Neste capítulo, abordaremos como substituir a configuração do NHibernate. Existem apenas algumas coisas que você precisa ter em mente.
Em primeiro lugar, a configuração no NHibernate é aditiva.
Assim, você não precisa apenas usar um único arquivo xml ou não precisa apenas usar a configuração baseada em código ou NHibernate fluente.
Você pode misturar e combinar todos esses métodos, dependendo de como deseja configurar seu aplicativo.
O ponto importante a lembrar é que, por último, a configuração vence.
No exemplo a seguir, você pode ver que criamos nosso objeto de configuração, configuramos-o usando a configuração baseada em código e, finalmente, chamamos o cfg.configure() método, que carrega o arquivo 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();
Portanto, qualquer coisa dentro de um hibernate.cfg.xml substitui as configurações definidas pela configuração baseada em código.
Ao reverter esses dois processos, podemos ter os padrões dentro de hibernate.cfg.xml e, em seguida, fazer nossas substituições dentro de uma configuração baseada em código.
Não há nada que exclua se você estiver usando a configuração baseada em código e também não há nada que o impeça de usar o arquivo hibernate.cfg.xml.
Vamos dar uma olhada em um exemplo simples em que substituiremos a configuração usando uma mistura de configuração baseada em xml e baseada em código.
Vamos também mover a string de conexão para o app.config arquivo usando o código a seguir.
<?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>
A string de conexão está em algum app.configarquivo com um nome padrão. Agora, precisamos mencionar o nome padrão no arquivo hibernate.cfg.xml em vez da string de conexão.
<?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>
Vamos comentar sobre a parte da string de conexão, driver e parte do dialeto da configuração baseada em código, porque o programa irá lê-lo do arquivo hibernate.cfg.xml e o LogSqlInConsole parte permanecerá na configuração baseada em 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();
}
}
}
}
Agora, ao executar o aplicativo, você verá que o programa leu o log da configuração baseada em código e outra configuração do arquivo 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
Agora temos algumas de nossas configurações dentro de nosso hibernate.cfg.xml arquivo, parte dele está dentro da configuração baseada em código e dependendo da ordem de chamada baseada em código versus configure(), podemos alterar qual deles substitui o outro.