如何在多数据库相同的模式环境中有效地使用NHibernate ISessionFactory?

时间:2015-08-03 18:54:58

标签: c# asp.net-mvc nhibernate fluent-nhibernate

我们正在开发一个MVC应用程序,并且拥有一个所有客户端都拥有自己的数据库副本的环境,所有这些都具有相同的模式。在某些情况下,用户可能需要在一个请求中访问多个客户端数据库。每次应用程序需要打开一个新的客户端数据库时,我都试图避免创建一个ISessionFactory实例。所有其他设置都是相同的,所以我真的想要一种方法来在创建后更改ISessionFactory的连接字符串。根据我的研究,似乎这不可能。

大多数人都将此article作为首选解决方案,基本上缓存配置,因此每次调用使用不同连接字符串创建会话工厂时都不需要重新评估。这篇文章现在已经有几年了,所以我想知道是否有其他人想出了一种更有效的方法来更改连接字符串或处理这种多租户环境?

2 个答案:

答案 0 :(得分:0)

就我而言,我派生自DriverConnectionProvider,覆盖GetConnection方法,以便为当前租户使用正确的连接字符串。选择连接字符串的逻辑封装在Provider对象中:

public class HibernateConnectionProvider : NHibernate.Connection.DriverConnectionProvider
{
    public static IProvider<string> ConnectionStringProvider { private get; set; }

    protected override string ConnectionString
    {
        get { return ConnectionStringProvider.ProvideValue(); }
    }
}

答案 1 :(得分:0)

我认为在MVC应用程序中委托管理数据库访问是错误的!

这应该委托给DevOps。要做到这一点,你需要每个客户使用MVC应用程序,然后你不需要担心代码支持数据库选择,尽管它需要额外的应用程序。但是,认为这是两者中较小的邪恶。

在目前的工作中,我们有这种架构(根据您分享的帖子的时间而设计),它确实导致了许多问题。例如,一个客户需要功能A,这需要数据库迁移B,这意味着停止所有客户的服务,并经常处理未处理的情况。