2010-07-12 49 views
1

我想流利地配置一个SessionFactory访问Oracle9i数据库,使用ODP.Net,我得到这个MissingConstructorException。我已经把流畅的映射整理出来了,但我不确定我做错了什么。FluentNHibernate.MissingConstructorException构建SessionFactory时

这里是个例外:

BasicConnectionTests.AssertThatWeCanConnectToADatabase : 

FailedFluentNHibernate.MissingConstructorException: 'FluentNHibernate.Automapping.IAutoClasslike, FluentNHibernate, Version=1.1.0.685, Culture=neutral, PublicKeyToken=8aa435e3cb308880' is missing a parameterless constructor. 
at FluentNHibernate.Utils.Extensions.InstantiateUsingParameterlessConstructor(Type type) 
at FluentNHibernate.PersistenceModel.Add(Type type) 
at FluentNHibernate.Utils.CollectionExtensions.Each<T>(IEnumerable`1 enumerable, Action`1 each) 
at FluentNHibernate.PersistenceModel.AddMappingsFromSource(ITypeSource source) 
at FluentNHibernate.Cfg.FluentMappingsContainer.Apply(Configuration cfg) 
at FluentNHibernate.Cfg.MappingConfiguration.Apply(Configuration cfg) 
at FluentNHibernate.Cfg.FluentConfiguration.BuildConfiguration() 
FluentNHibernate.Cfg.FluentConfigurationException: An invalid or incomplete configuration was used while creating a SessionFactory. Check PotentialReasons collection, and InnerException for more detail. 


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


at FluentNHibernate.Cfg.FluentConfiguration.BuildSessionFactory() 
at MyAwesomeApp.sessionFactories.Oracle9SessionFactoryWrapper.Configure(String userName, String passWord, String dataBase) in Oracle9SessionFactoryWrapper.cs: line 26 
at MyAwesomeApp.Tests.oracle.BasicConnectionTests.AssertThatWeCanConnectToADatabase() in BasicConnectionTests.cs: line 17 

下面是一口流利的映射:

public ISessionFactory Configure(string userName, string passWord, string dataBase) 
     { 
      var config = Fluently.Configure(); 

      config.Database(
       OracleDataClientConfiguration.Oracle9 
        .ConnectionString(cs => cs.Username(userName).Password(passWord).Instance(dataBase)) 
        .Driver("NHibernate.Driver.OracleDataClientDriver") 
#if DEBUG 
        .ShowSql() 
#endif 
       ); 

      config.Mappings(
       m => m.FluentMappings.AddFromAssembly(Assembly.GetCallingAssembly())); 

      return config.BuildSessionFactory(); 
     } 

如果有人能指出我要去哪里错了,我将感激不尽。

+0

'Assembly.GetCallingAssembly()'返回什么程序集?它看起来像是'FluentNHibernate.dll'。 – 2010-07-12 11:15:31

+0

没关系 - 我是个笨蛋,不应该被允许做这种事情。很明显,我应该使用AddFromAssemblyOf (),很明显,当您在单元测试中运行代码时,Assembly.GetCallingAssembly()并不是非常有用。 感谢指出(应该是什么)的盲目明显:) – 2010-07-12 13:14:02

回答

2

正如詹姆斯格雷戈里在他对我的问题的评论中所指出的那样,当我告诉Fluent是我的映射时,我做了一件非常愚蠢的事情。

当代码从单元测试的上下文中执行时,m => m.FluentMappings.AddFromAssembly(Assembly.GetCallingAssembly())试图告诉Fluent查看单元测试程序集中的映射 - 这很可能会失败。

答案是使用m => m.FluentMappings.AddFromAssemblyOf<Foo>(),其中Foo是映射所在的程序集中的一个类型。

相关问题