要做一些自定义(黑盒子)SQL操作,我需要有一个IDBConnection实例到我们已经定期通过NHibernate访问的数据库。
我不想部署单独的数据库配置(一个本机,一个nhibernate),而是希望NHibernate让我直接访问已配置的数据库。
我看到ISession接口有一个连接属性,我可以创建一个虚拟会话,但我宁愿使用一个完全独立于任何会话创建的连接。
所以我想知道是否有机会获得会话工厂用来为创建的会话提供连接的IConnectionProvider实例?
答案 0 :(得分:1)
我认为打开一个会话只是为了获得连接。我能想到的唯一问题是如果没有存储在某个地方,会话可能会意外地进行GC。
如果您需要会话提供程序,则需要访问Configuration对象:
public IConnectionProvider GetProvider(NHibernate.Cfg.Configuration cfg)
{
var type = Type.GetType(cfg.GetProperty(Environment.ConnectionProvider));
return (IConnectionProvider) Activator.CreateInstance(type);
}
答案 1 :(得分:1)
此解决方案依赖于NHibernate的实现细节。它在我使用它的所有实例中都有效,但在升级NHibernate之后可能不是这样。
假设您有我们的字段ISessionFactory _sessionFactory
,您可以使用以下强制转换来访问连接提供程序。尽管文档说接口ISessionFactoryImplementor
用于会话工厂和NHibernate的其他部分之间的通信,但它是公开的。
(_sessionFactory as NHibernate.Engine.ISessionFactoryImplementor).ConnectionProvider