Наткнулся на это и подумал, что я бы добавил свое решение для будущих читателей, которое, в основном, и предложил Маурисио Шеффер, которое заключает в себе «переключение» CS и обеспечивает единую точку управления (мне нравится это больше, чем необходимость проходить в каждом сеансовом вызове меньше «пропустить» и пойти не так).
Я получаю строку подключения во время аутентификации клиента и устанавливаю контекст, а затем, используя следующую реализацию IConnectinProvider, устанавливаю это значение для CS при каждом открытии сеанса:
/// <summary>
/// Provides ability to switch connection strings of an NHibernate Session Factory (use same factory for multiple, dynamically specified, database connections)
/// </summary>
public class DynamicDriverConnectionProvider : DriverConnectionProvider, IConnectionProvider
{
protected override string ConnectionString
{
get
{
var cxnObj = IsWebContext ?
HttpContext.Current.Items["RequestConnectionString"]:
System.Runtime.Remoting.Messaging.CallContext.GetData("RequestConnectionString");
if (cxnObj != null)
return cxnObj.ToString();
//catch on app startup when there is not request connection string yet set
return base.ConnectionString;
}
}
private static bool IsWebContext
{
get { return (HttpContext.Current != null); }
}
}
Затем подключите его во время NHConfig:
var configuration = Fluently.Configure()
.Database(MsSqlConfiguration.MsSql2005
.Provider<DynamicDriverConnectionProvider>() //Like so