Мы начинаем с подключения (Fluent) NHibernate 2.1.2 к устаревшему приложению ASP.NET.
Ранее мы подключались к базе данных Oracle 9 с помощью System.Data.OracleClient, но из-за некоторых требований (а именно с использованием Oracle SP с картами HBM) кажется, что по крайней мере для компонента NH мы будем вместо этого придется адаптировать Oracle.DataAccess.dll.
По большей части нам удалось заставить этот бит работать следующим образом:
- Добавление и ссылка на Oracle.DataAccess.dll 9.2.0.700 в слой данных.
- Квалификация сборки Oracle.DataAccess через web.config. [* 1 010 * * с помощью +1011 *]
- Добавление OraOps9.dll в приложение и установка для него Встроенный ресурс .
Последний шаг, который мы сделали, потому что наша версия ODP ссылается на него, но у нас ограничены возможности, чтобы в конечном итоге он присутствовал на рабочем сервере.
Это в конечном итоге привело к получению InvalidCastException:
Невозможно привести объект типа
'Oracle.DataAccess.Client.OracleConnection'
печатать
'System.Data.Common.DbConnection'
Отыскивая решение, статус-кво , казалось, гарантировал, что свойство hbm2dll.keywords
в конфигурации NH было установлено на 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
обратно к чему-то другому? Есть идеи?