2012-09-15 60 views
0

我有一个基于.Net的命令行应用程序与PostgreSQL 9.1交互(CRUD)。使用Nuget,该项目目前引用NHibernate 3.2.0.4000和FluentHibenrate 1.3.0.717NHibernate在单声道下抛出TypeLoadException

现在代码在.Net环境(意思是Windows Xp/7)下运行良好,但是在Mono下(Mono JIT编译器版本2.10.8.1(Debian 2.10.8.1-1ubuntu2.2)),我看到在NHibernate中的TypeLoadException从完全相同的代码(我没有重新编译任何单声道。)。有人可以帮忙指点吗?谢谢!

这里是堆栈跟踪

FluentNHibernate.Cfg.FluentConfigurationException: An invalid or incomplete configuration was used while creating a SessionFactory. Check PotentialReasons collection, and InnerException for more detail. 

---> FluentNHibernate.Cfg.FluentConfigurationException: An invalid or incomplete configuration was used while creating a SessionFactory. Check PotentialReasons collection, and InnerException for more detail. 

---> NHibernate.MappingException: Could not compile the mapping document: (XmlDocument) ---> System.TypeInitializationException: An exception was thrown by the type initializer for NHibernate.Dialect.Dialect ---> System.TypeLoadException: Could not load type 'NHibernate.Dialect.Dialect+NoOpViolatedConstraintNameExtracter' from assembly 'NHibernate, Version=3.2.0.4000, Culture=neutral, PublicKeyToken=aa95f207798dfdb4'. 
    --- End of inner exception stack trace --- 
    at NHibernate.Cfg.Configuration.AddDeserializedMapping (NHibernate.Cfg.MappingSchema.HbmMapping mappingDocument, System.String documentFileName) [0x00000] in <filename unknown>:0 
    --- End of inner exception stack trace --- 
    at NHibernate.Cfg.Configuration.LogAndThrow (System.Exception exception) [0x00000] in <filename unknown>:0 
    at NHibernate.Cfg.Configuration.AddDeserializedMapping (NHibernate.Cfg.MappingSchema.HbmMapping mappingDocument, System.String documentFileName) [0x00000] in <filename unknown>:0 
    at NHibernate.Cfg.Configuration.AddValidatedDocument (NHibernate.Cfg.NamedXmlDocument doc) [0x00000] in <filename unknown>:0 
    at NHibernate.Cfg.Configuration.ProcessMappingsQueue() [0x00000] in <filename unknown>:0 
    at NHibernate.Cfg.Configuration.AddDocumentThroughQueue (NHibernate.Cfg.NamedXmlDocument document) [0x00000] in <filename unknown>:0 
    at NHibernate.Cfg.Configuration.AddXmlReader (System.Xml.XmlReader hbmReader, System.String name) [0x00000] in <filename unknown>:0 
    at NHibernate.Cfg.Configuration.AddInputStream (System.IO.Stream xmlInputStream, System.String name) [0x00000] in <filename unknown>:0 
    --- End of inner exception stack trace --- 
    at FluentNHibernate.Cfg.FluentConfiguration.BuildConfiguration() [0x00000] in <filename unknown>:0 
    at FluentNHibernate.Cfg.FluentConfiguration.BuildSessionFactory() [0x00000] in <filename unknown>:0 


    --- End of inner exception stack trace --- 
    at FluentNHibernate.Cfg.FluentConfiguration.BuildSessionFactory() [0x00000] in <filename unknown>:0 
    at MyProj.Repository.FluentNHibernateHelperPostgreSQL.CreateSessionFactory() [0x00000] in <filename unknown>:0 
    at MyProj.Repository.FluentNHibernateHelperPostgreSQL.get_SessionFactory() [0x00000] in <filename unknown>:0 
    at MyProj.Repository.FluentNHibernateHelperPostgreSQL.OpenSession() [0x00000] in <filename unknown>:0 
    at MyProj.Repository.NHibernateSessionHelper.SmartSessionFactory() [0x00000] in <filename unknown>:0 
    at MyProj.Repository.NHibernateSessionHelper.DoAnything (MyProj.Repository.TargetMethod target) [0x00000] in <filename unknown>:0 
    at MyProj.Program+<>c__DisplayClass10.<RetrieveDataDriver>b__a() [0x00000] in <filename unknown>:0 

下面是FluentNHibernateHelperPostgreSQL.CreateSessionFactory()

private static ISessionFactory CreateSessionFactory() 
    { 
     FluentConfiguration fluentConfiguration = Fluently.Configure(); 
     PostgreSQLConfiguration standard = PostgreSQLConfiguration.Standard; 
     FluentConfiguration fluentConfiguration1 = fluentConfiguration.Database(((PersistenceConfiguration<PostgreSQLConfiguration, PostgreSQLConnectionStringBuilder>)standard).ConnectionString((PostgreSQLConnectionStringBuilder c) => c.FromConnectionStringWithKey("ConnectionStringKey"))); 
     ISessionFactory sessionFactory = fluentConfiguration1.Mappings((MappingConfiguration m) => m.AutoMappings.Add(FluentNHibernateHelperPostgreSQL.CreateAutomappings)).ExposeConfiguration(FluentNHibernateHelperPostgreSQL.BuildSchema).BuildSessionFactory(); 
     return sessionFactory; 
    } 
+1

它看起来像你的一个映射文档引用了Mono无法找到的类型。如果你在nHibernate中有log4net配置,你应该能够看到关于什么文档和它试图加载的类型的更多细节。为此,请将log4net appenders添加到您的配置文件中,如http://nhforge.org/wikis/howtonh/configure-log4net-for-use-with-nhibernate.aspx中所述,然后记得调用log4net.Config.XmlConfigurator()在尝试创建sessionfactory前 – jakobandersen

+0

我能够让log4net生成日志。但是,它尚未确定确切原因。无论哪种情况,log4net都显示代码能够生成 xml blob。唯一的区别是Windows输出'2012-09-18 01:18:27,508 [1] INFO NHibernate.Dialect.Dialect - 使用方言:NHibernate.Dialect.PostgreSQLDialect'而单声道输出'2012-09-18 01:03 :31,529 [1] ERROR NHibernate.Cfg.Configuration - 无法编译映射文档:(XmlDocument)' 我需要再次使用log4net来查看它是否可以生成更深入的日志 – Antony

+1

我会测试与单声道2.11.4 – knocte

回答

1

的解决方案是手动部署最新单声道包从go-mono.com相关的代码 正如评论部分中的knocte所示,2.11.4解决了这个问题。

我还没有尝试3.x,但到目前为止,我一直很高兴2.11.x没有理由跳入3.x船。

相关问题