Getting the ConnectionProvider from a SessionFactory

本文关键字:SessionFactory from ConnectionProvider the Getting | 更新日期: 2023-09-27 18:13:10

要做一些自定义(黑箱)SQL操作,我需要有一个IDBConnection实例到我们已经通过NHibernate定期访问的数据库。

我不想部署单独的数据库配置(一个本地,一个nhibernate),而是希望nhibernate让我直接访问已经配置的数据库。

我看到session接口有一个连接属性,我可以创建一个虚拟会话,但是我宁愿使用一个完全独立于任何会话的连接。

所以我想知道是否有机会获得由会话工厂使用的IConnectionProvider实例来为创建的会话提供连接?

Getting the ConnectionProvider from a SessionFactory

这个解决方案依赖于NHibernate的一个实现细节。它在我使用它的所有实例中都有效,但在升级NHibernate后可能不成立。

假设您有我们的字段ISessionFactory _sessionFactory,您可以使用以下强制转换来访问连接提供程序。尽管文档中说接口ISessionFactoryImplementor是用于会话工厂和NHibernate的其他部分之间的通信,但它是公共的。

(_sessionFactory as NHibernate.Engine.ISessionFactoryImplementor).ConnectionProvider

我认为打开一个会话只是为了获得连接是很好的。我能想到的唯一问题是,如果不将会话存储在某个地方,会话可能会意外地GCed。

如果需要会话提供程序,则需要访问Configuration对象:

public IConnectionProvider GetProvider(NHibernate.Cfg.Configuration cfg)
{
    var type = Type.GetType(cfg.GetProperty(Environment.ConnectionProvider));
    return (IConnectionProvider) Activator.CreateInstance(type);
}