使用带有Fluent NHibernate的ODP 9的InvalidCastException

时间:2011-02-24 20:49:54

标签: oracle nhibernate fluent-nhibernate

我们开始将(Fluent)NHibernate 2.1.2插入到传统的ASP.NET应用程序中。

以前我们一直使用System.Data.OracleClient连接到Oracle 9数据库,但由于一些要求(即使用带有HBM映射的Oracle SP),似乎至少对于NH组件,我们会必须改为改编Oracle.DataAccess.dll。

在大多数情况下,我们通过以下方式成功实现了这一点:

  1. 在数据层中添加并引用9.2.0.700 Oracle.DataAccess.dll。
  2. 通过web.config限定Oracle.DataAccess程序集。 [via]
  3. 将OraOps9.dll添加到应用程序中,并将其设置为 Embedded Resource
  4. 最后一步,我们已经完成了,因为我们的ODP版本引用了它,但我们的能力有限,以确保它最终会出现在生产服务器上。

    这最终导致了一个InvalidCastException:

      

    无法投射类型的对象   'Oracle.DataAccess.Client.OracleConnection'   输入   'System.Data.Common.DbConnection'

    为解决方案进行筛选,the status quo似乎是为了确保NH配置中的hbm2dll.keywords属性设置为none。我已经在动态创建的配置和流畅的调用中创建了SessionFactory。

    NHibernate.Cfg.Configuration cfg = 
                new NHibernate.Cfg.Configuration()
                    .SetProperty("dialect", "NHibernate.Dialect.Oracle9iDialect")                    
                    .SetProperty("connection.driver_class", "NHibernate.Driver.OracleDataClientDriver")
                    .SetProperty("connection.connection_string",conn)
                    .SetProperty("connection.provider","NHibernate.Connection.DriverConnectionProvider")                    
                    .SetProperty("hbm2dll.keywords","none")
                    ;            
    
            _sessionFactory = Fluently.Configure(cfg)                
                .Database ( OracleDataClientConfiguration.Oracle9.ConnectionString(conn) )                
                .Mappings ( x => x.FluentMappings.AddFromAssemblyOf<MyDL>() )
                .Mappings ( x => x.HbmMappings.AddFromAssemblyOf<MyEntity>() )
                .ExposeConfiguration(x => x.Properties.Add("hbm2dll.keywords", "none"))
                .BuildSessionFactory()
                ;     
    

    但即便如此,我仍然得到相同的InvalidCastException。

    还有什么可能导致这个吗?上面的任何一个调用是否意外地将hbm2dll.keywords属性值绊倒回别的东西?有什么想法吗?

1 个答案:

答案 0 :(得分:2)

ODP 9太老了,IIRC是针对.NET 1.1编译的。

您至少需要使用ODP 10.