在 Fluent Nhibernate 中使用多个数据库,System.TypeInitializationException 未处理 [英] Using Multiple databases in Fluent Nhibernate, System.TypeInitializationException was unhandled

查看:17
本文介绍了在 Fluent Nhibernate 中使用多个数据库,System.TypeInitializationException 未处理的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图实现 多个数据库连接Fluent NHibernate 示例应用程序.

我的 Fluent NHibernate Repository 如下:

My Fluent NHibernate Repository is as follows:

namespace RepositoryExample.Repository.NHibernate {
    public class NHibernateRepository<T> : IRepository<T> where T : class
    {
        protected static Configuration config;
        private static readonly ISessionFactory _globalSessionFactory = new Configuration().Configure().BuildSessionFactory();

    protected static IDictionary<string, ISessionFactory> _allFactories;
    public NHibernateRepository()
    {
        IDictionary<string, string> dataBases = new Dictionary<string, string>();
        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<string, ISessionFactory>(dataBases.Count);
        foreach (var dataBase in dataBases)
        {
            config = Fluently.Configure()
                .Database(
                MsSqlConfiguration.MsSql2008.ConnectionString(dataBase.Value))
                .Mappings(m => m.FluentMappings.AddFromAssemblyOf<NHibernateRepository<T>>())
                .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<NHibernateIntegrationTest>();
            repo.GenerateSchema(SanityCheck.ThisWillDropMyDatabase);
        }
    }

错误于:

_allFactories = new Dictionary<string, ISessionFactory>(dataBases.Count);

它在 NHibernateRepository 类的默认构造函数中.

It is in NHibernateRepository class's default constructor.

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 SettingspavankumarnMy DocumentsDownloads
hibernate-repository-exampleRepositoryExampleRepositoryNHibernateNHibernateRepository.cs:line 44
       at Test.NHibernateIntegrationTest.Main(String[] args) in C:Documents and SettingspavankumarnMy DocumentsDownloads
hibernate-repository-exampleTestNHibernateIntegrationTest.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 SettingspavankumarnMy DocumentsDownloads
hibernate-repository-exampleRepositoryExampleRepositoryNHibernateNHibernateRepository.cs:line 17
       InnerException: System.IO.FileNotFoundException
            Message=Could not find file 'C:Documents and SettingspavankumarnMy DocumentsDownloads
hibernate-repository-exampleTestinDebughibernate.cfg.xml'.
            Source=mscorlib
            FileName=C:Documents and SettingspavankumarnMy DocumentsDownloads
hibernate-repository-exampleTestinDebughibernate.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 配置会话工厂.但内部堆栈跟踪显示未找到 hibernate.cfg.xml 文件.请参阅下面的屏幕截图.

I'm not using hibernate.cfg.xml, since I'm configuring the session factory Fluently. But Inner stack trace is showing that hibernate.cfg.xml file is not found. See the below screenshot.

推荐答案

你在最内部的异常中有非常明确的错误信息:

You have very clear error message in your most inner exception:

找不到文件 'C:Documents and SettingspavankumarnMyDocumentsDownloads hibernate-repository-exampleTestinDebughibernate.cfg.xml'.

Could not find file 'C:Documents and SettingspavankumarnMy DocumentsDownloads hibernate-repository-exampleTestinDebughibernate.cfg.xml'.

您的测试项目中可能有该文件.将其 Build Action 设置为 None 并将 Copy to Output Directory 设置为 Copy if newer.

You probably have that file in your Test project. Set its Build Action to None and Copy to Output Directory to Copy if newer.

实际上,问题不在于构造函数本身,而在于其上方的一行:

Actually, the problem was not in constructor itself, but in a line above it:

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

在这里,您将使用默认值创建另一个 NHibernate 配置.默认情况下,当您创建 new Configuration() 时,它会尝试从 app.confighibernate.cfg.xml 加载.

Here you are creating another NHibernate Configuration, using the defaults. And by default, when you create a new Configuration(), it will try to load from app.config or hibernate.cfg.xml.

删除该行.我没有看到在任何地方使用的 _globaSessionFactory.

Remove that line. I don't see the _globaSessionFactory used anywhere.

这篇关于在 Fluent Nhibernate 中使用多个数据库,System.TypeInitializationException 未处理的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆