Использование нескольких баз данных в Fluent Nhibernate, исключение System.TypeInitializationException было необработанным

Я пытался внедрить приложение Application Fluent NHibernate с несколькими БД .

My Fluent NHibernate Repository выглядит следующим образом:

namespace RepositoryExample.Repository.NHibernate { public class NHibernateRepository : IRepository where T : class { protected static Configuration config; private static readonly ISessionFactory _globalSessionFactory = new Configuration().Configure().BuildSessionFactory(); protected static IDictionary _allFactories; public NHibernateRepository() { IDictionary dataBases = new Dictionary(); dataBases.Add("Monkey", @"Data Source=.\SQLEXPRESS;AttachDbFilename='MonkeyDB.mdf';Integrated Security=True;User Instance=True"); dataBases.Add("Banana", @"Data Source=.\SQLEXPRESS;AttachDbFilename='Banana.mdf';Integrated Security=True;User Instance=True"); // Error at below line (See stack trace for deatils below) _allFactories = new Dictionary(dataBases.Count); foreach (var dataBase in dataBases) { config = Fluently.Configure() .Database( MsSqlConfiguration.MsSql2008.ConnectionString(dataBase.Value)) .Mappings(m => m.FluentMappings.AddFromAssemblyOf<NHibernateRepository>()) .BuildConfiguration(); _allFactories.Add(dataBase.Key, config.BuildSessionFactory()); } } public ISession GetSession() { var currentIdentifier = GetCurrentIdentifier(); return _allFactories[currentIdentifier].OpenSession(); } private string GetCurrentIdentifier() { if (typeof(T).ToString().Contains("Banana")) { return "Banana"; } else { return "Monkey"; } } public void Save(T value) { var sessioned = GetSession(); using (var transaction = sessioned.BeginTransaction()) { sessioned.Save(value); transaction.Commit(); } } public void GenerateSchema(SanityCheck AreYouSure) { new SchemaExport(config).Create(true,true); } } } 

И я звоню следующим образом:

 public class NHibernateIntegrationTest { static void Main(string[] args) { var repo = new NHibernateRepository(); repo.GenerateSchema(SanityCheck.ThisWillDropMyDatabase); } } 

Ошибка при:

 _allFactories = new Dictionary(dataBases.Count); 

Он находится в стандартном конструкторе classа NHibernateRepository.

 StackTrace: System.TypeInitializationException was unhandled Message=The type initializer for 'RepositoryExample.Repository.NHibernate.NHibernateRepository`1' threw an exception. Source=RepositoryExample TypeName=RepositoryExample.Repository.NHibernate.NHibernateRepository`1 StackTrace: at RepositoryExample.Repository.NHibernate.NHibernateRepository`1..ctor() in C:\Documents and Settings\pavankumarn\My Documents\Downloads\nhibernate-repository-example\RepositoryExample\Repository\NHibernate\NHibernateRepository.cs:line 44 at Test.NHibernateIntegrationTest.Main(String[] args) in C:\Documents and Settings\pavankumarn\My Documents\Downloads\nhibernate-repository-example\Test\NHibernateIntegrationTest.cs:line 17 at System.AppDomain._nExecuteAssembly(Assembly assembly, String[] args) at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args) at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly() at System.Threading.ThreadHelper.ThreadStart_Context(Object state) at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) at System.Threading.ThreadHelper.ThreadStart() InnerException: NHibernate.Cfg.HibernateConfigException Message=An exception occurred during configuration of persistence layer. Source=NHibernate StackTrace: at NHibernate.Cfg.ConfigurationSchema.HibernateConfiguration..ctor(XmlReader hbConfigurationReader, Boolean fromAppSetting) at NHibernate.Cfg.ConfigurationSchema.HibernateConfiguration..ctor(XmlReader hbConfigurationReader) at NHibernate.Cfg.Configuration.Configure(XmlReader textReader) at NHibernate.Cfg.Configuration.Configure(String fileName, Boolean ignoreSessionFactoryConfig) at NHibernate.Cfg.Configuration.Configure(String fileName) at NHibernate.Cfg.Configuration.Configure() at RepositoryExample.Repository.NHibernate.NHibernateRepository`1..cctor() in C:\Documents and Settings\pavankumarn\My Documents\Downloads\nhibernate-repository-example\RepositoryExample\Repository\NHibernate\NHibernateRepository.cs:line 17 InnerException: System.IO.FileNotFoundException Message=Could not find file 'C:\Documents and Settings\pavankumarn\My Documents\Downloads\nhibernate-repository-example\Test\bin\Debug\hibernate.cfg.xml'. Source=mscorlib FileName=C:\Documents and Settings\pavankumarn\My Documents\Downloads\nhibernate-repository-example\Test\bin\Debug\hibernate.cfg.xml StackTrace: at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath) at System.IO.FileStream.Init(String path, FileMode mode, FileAccess access, Int32 rights, Boolean useRights, FileShare share, Int32 bufferSize, FileOptions options, SECURITY_ATTRIBUTES secAttrs, String msgPath, Boolean bFromProxy) at System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share, Int32 bufferSize) at System.Xml.XmlDownloadManager.GetStream(Uri uri, ICredentials credentials) at System.Xml.XmlUrlResolver.GetEntity(Uri absoluteUri, String role, Type ofObjectToReturn) at System.Xml.XmlTextReaderImpl.OpenUrlDelegate(Object xmlResolver) at System.Threading.CompressedStack.runTryCode(Object userData) at System.Runtime.CompilerServices.RuntimeHelpers.ExecuteCodeWithGuaranteedCleanup(TryCode code, CleanupCode backoutCode, Object userData) at System.Threading.CompressedStack.Run(CompressedStack compressedStack, ContextCallback callback, Object state) at System.Xml.XmlTextReaderImpl.OpenUrl() at System.Xml.XmlTextReaderImpl.Read() at System.Xml.XmlTextReader.Read() at System.Xml.XmlCharCheckingReader.Read() at System.Xml.XsdValidatingReader.Read() at System.Xml.XPath.XPathDocument.LoadFromReader(XmlReader reader, XmlSpace space) at System.Xml.XPath.XPathDocument..ctor(XmlReader reader, XmlSpace space) at System.Xml.XPath.XPathDocument..ctor(XmlReader reader) at NHibernate.Cfg.ConfigurationSchema.HibernateConfiguration..ctor(XmlReader hbConfigurationReader, Boolean fromAppSetting) InnerException: 

Я не использую hibernate.cfg.xml, так как я настраиваю сессионную фабрику Fluently. Но Inner stack trace показывает, что файл hibernate.cfg.xml не найден. См. Снимок экрана ниже. введите описание изображения здесь

У вас очень четкое сообщение об ошибке в вашем самом внутреннем исключении:

Не удалось найти файл «C: \ Documents and Settings \ pavankumarn \ My Documents \ Downloads \ nhibernate-repository-example \ Test \ bin \ Debug \ hibernate.cfg.xml ‘.

Вероятно, у вас есть этот файл в тестовом проекте. Установите для параметра « Build Action значение « None и « Copy to Output Directory для Copy if newer .


Редактировать:

На самом деле проблема была не в самом конструкторе, а в строке над ним:

 private static readonly ISessionFactory _globalSessionFactory = new Configuration().Configure().BuildSessionFactory(); 

Здесь вы создаете другую конфигурацию NHibernate, используя настройки по умолчанию. И по умолчанию при создании new Configuration() она попытается загрузить из app.config или hibernate.cfg.xml .

Удалите эту строку. Я не вижу, чтобы _globaSessionFactory использовалась где угодно.