SessionFactory - одна фабрика для нескольких баз данных - PullRequest
4 голосов
/ 30 августа 2010

У нас есть ситуация, когда у нас есть несколько баз данных с одинаковой схемой, но разными данными в каждой.Мы создаем одну фабрику сессий, чтобы справиться с этим.

Проблема в том, что мы не знаем, к какой базе данных мы будем подключаться до времени выполнения, когда мы сможем это предоставить.Но при запуске, чтобы получить заводскую сборку, нам нужно подключиться к базе данных с этой схемой.В настоящее время мы делаем это, создавая схему в известном месте и используя ее, но мы хотели бы убрать это требование.

Мне не удалось найти способ создания фабрики сеансов без указанияподключение.Мы не ожидаем, что сможем использовать метод OpenSession без параметров, и это нормально.

Есть идеи?Спасибо Энди

Ответы [ 4 ]

2 голосов
/ 30 августа 2010

Либо реализуйте свой собственный IConnectionProvider, либо передайте свое собственное соединение ISessionFactory.OpenSession(IDbConnection) (но прочтите комментарии метода об отслеживании соединений)

0 голосов
/ 12 февраля 2013

Наткнулся на это и подумал, что я бы добавил свое решение для будущих читателей, которое, в основном, и предложил Маурисио Шеффер, которое заключает в себе «переключение» 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
0 голосов
/ 07 февраля 2012

Вы также можете использовать отличный пакет NuGet от Brady Gaster для этого.Я сделал собственную реализацию из его пакета NHQS, и она работает очень хорошо.

Вы можете найти ее здесь:

http://www.bradygaster.com/Tags/nhqs

удачи!

0 голосов
/ 30 марта 2011

Решение, которое мы придумали, состояло в том, чтобы создать класс, который будет управлять этим для нас. Класс может использовать некоторую информацию в вызове метода для выполнения некоторой логики маршрутизации, чтобы выяснить, где находится база данных, а затем вызвать OpenSession, передав строку подключения.

...