Как изменить во время выполнения имя каталога для всех объектов во всех запросах, используя NHibernate с MS SQL Server? - PullRequest
0 голосов
/ 27 января 2012

У меня есть приложение (web), в котором каждый пользователь, вошедший в систему, имеет эксклюзивный каталог (работает как частная база данных - , пожалуйста, не спрашивайте меня, почему, требования к проекту здесь не обсуждаются ) .

Итак, мне нужно сообщить NHiberante ISession (или что-то подобное escope), которое является именем каталога и именем схемы, чтобы правильно построить полные имена объектов, так: catalog.schema.table, catalog.schema.procedure, ...

Смотри, что я избегаю иметь пул сессионных фабрик, я предпочитаю иметь только один SessionFactory и доступ отдельные каталоги, сообщающие NHibernate, какие из них использовать на каждом ISession или аналогичном.

Я знаю, что могу перехватывать все операторы SQL с помощью IInterceptor.OnPrepareStatement(), но этот подход должен анализировать во время выполнения все операторы, это не очень хороший подход.

Какие могут быть другие решения? А что лучше (производительность, ремонтопригодность, ...)?

Спасибо.

1 Ответ

1 голос
/ 28 января 2012

Вместо перехвата отдельных операторов SQL вы можете реализовать свой собственный ConnectionProvider для выдачи оператора use <catalog>.

Например:

public class MyConnectionProvider : DriverConnectionProvider
{
    public override IDbConnection GetConnection()
    {
        var connection = base.GetConnection();
        var useCommand = connection.CreateCommand();
        use.CommandText = "use " + GetCatalog();
        useCommand.ExecuteNonQuery();
        return connection;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...