gpt4 book ai didi

c# - 在 Fluent Nhibernate 中使用多个数据库,System.TypeInitializationException 未处理

转载 作者:行者123 更新时间:2023-11-30 12:13:39 26 4
gpt4 key购买 nike

我正在尝试实现 Multiple DB connected Fluent NHibernate sample Application .

我的 Fluent NHibernate Repository如下:

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 类的默认构造函数中。

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,因为我正在流畅地配置 session 工厂。但内部堆栈跟踪显示未找到 hibernate.cfg.xml 文件。请参阅下面的屏幕截图。 enter image description here

最佳答案

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

Could not find file '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.confighibernate.cfg.xml 加载。

删除该行。我没有看到任何地方使用了 _globaSessionFactory

关于c# - 在 Fluent Nhibernate 中使用多个数据库,System.TypeInitializationException 未处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11225101/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com