如上所述。
答案 0 :(得分:11)
ISessionFactory.OpenSession()可以提供IDbConnection。
另一种选择是实现一个IConnectionProvider,它会根据某些条件创建适当的IDbConnection实例(必须是全局的,因此这个解决方案不是很干净)。
答案 1 :(得分:3)
请注意,向IDbConnection
提供OpenSession()
时,您将无法使用二级缓存。
请参阅https://forum.hibernate.org/viewtopic.php?f=25&t=959178
... “这不是一个错误。如果您正在管理自己的连接,NHibernate会禁止使用二级缓存来保证会话安全。”...
答案 2 :(得分:1)
嗯,这可能很棘手,但我认为不应该这样做,但这就是这个想法:
var cfg = new Configuration(); // Get a new NHibernate Configuration
cfg.SetProperty("connection.connection_string", yourConnectionString); // Alter the property
cfg.Configure(); // Configure with this configuration
var sf = cfg.BuildSessionFactory(); // Get a new ISessionFactory
我不知道这是否是最好的方法,但可能有用。您也可以拥有2个配置xml文件并执行此操作:
var cfg = new Configuration("hibernate1.cfg.xml"); // OR
var cfg = new Configuration("hibernate2.cfg.xml");
响应注释,您可以初始化几个会话工厂并准备使用,但这并不完全是“更改连接字符串”。然后选择你需要的那个。代价高昂的部分是创建Configuration对象并调用Configure()。
还有NHibernate Burrow库,可以同时管理多个会话,并根据实体选择正确的会话。
var session = new BurrowFramework().GetSession(); // default session
var session = new BurrowFramework().GetSession(typeof(Entity)); // session that manages Entity class
答案 3 :(得分:1)
SessionFactory用于设置连接,方言等,因此如果要更改连接字符串,则需要重新配置。但是,是的,你的评论是正确的。设置会话工厂是最昂贵的操作之一,因此您只需要在需要时再执行此操作,而不再需要。
nHibernate Burrow中有一些非常棒的对话概念。如果你看一下他们如何管理会话,你可能会发现一些创意来管理多个数据库中的多个会话。
我有一个与@ Marc原则相同的建议:您可以很好地将动态连接封装在提供程序中。看看nhibernate.info wiki regarding dynamic connection providers。您可以轻松地构建一个提供程序,在该提供程序中传递所需的信息,以便构建指向所需数据库的会话。
我在100多个数据库之上使用nHibernate 2.0(所有数据库都有相同的模式,但物理上是分开的数据)所以它绝对可以用一点TLC来完成; - )