NHibernate - Konfiguration überschreiben
In diesem Kapitel wird erläutert, wie Sie die NHibernate-Konfiguration überschreiben. Es gibt nur ein paar Dinge, die Sie beachten müssen.
Zunächst ist die Konfiguration in NHibernate additiv.
Sie müssen also nicht nur eine einzelne XML-Datei oder die codebasierte Konfiguration oder fließend NHibernate verwenden.
Sie können alle diese Methoden mischen und anpassen, je nachdem, wie Sie Ihre Anwendung konfigurieren möchten.
Der wichtige Punkt, an den Sie sich erinnern sollten, ist, dass zuletzt die Konfiguration gewinnt.
Im folgenden Beispiel sehen Sie, dass wir unser Konfigurationsobjekt erstellen, es mithilfe der codebasierten Konfiguration konfigurieren und schließlich das aufrufen cfg.configure() Methode, die die Datei hibernate.cfg.xml lädt.
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();
Alles in einer hibernate.cfg.xml überschreibt also die Einstellungen, die durch die codebasierte Konfiguration festgelegt wurden.
Durch Umkehren dieser beiden Prozesse können wir die Standardeinstellungen in hibernate.cfg.xml festlegen und dann unsere Überschreibungen in einer codebasierten Konfiguration vornehmen.
Es gibt nichts, was ausschließt, wenn Sie eine codebasierte Konfiguration verwenden, und es gibt auch nichts, was Sie daran hindert, die Datei hibernate.cfg.xml zu verwenden.
Schauen wir uns ein einfaches Beispiel an, in dem wir die Konfiguration mithilfe einer Mischung aus XML-basierter und Code-basierter Konfiguration überschreiben.
Verschieben wir auch die Verbindungszeichenfolge in die app.config Datei mit dem folgenden Code.
<?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>
Die Verbindungszeichenfolge sitzt in einigen app.configDatei mit einem Standardnamen. Jetzt müssen wir den Standardnamen in der Datei hibernate.cfg.xml anstelle der Verbindungszeichenfolge erwähnen.
<?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>
Lassen Sie uns den Teil der Verbindungszeichenfolge, den Treiber und den Dialektteil aus der codebasierten Konfiguration kommentieren, da das Programm ihn aus der Datei hibernate.cfg.xml und der Datei liest LogSqlInConsole Teil bleibt in der codebasierten Konfiguration.
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();
}
}
}
}
Wenn Sie nun die Anwendung ausführen, sehen Sie, dass das Programm das Protokoll aus der codebasierten Konfiguration und andere Konfigurationen aus der Datei hibernate.cfg.xml gelesen hat.
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
Jetzt haben wir einen Teil unserer Konfiguration in unserem hibernate.cfg.xml Ein Teil davon befindet sich in der codebasierten Konfiguration und hängt von der Reihenfolge des Aufrufs von codebasiert im Vergleich zu ab configure()können wir ändern, welcher von ihnen den anderen überschreibt.