2

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

Конкретно: если предоставленное значение даты находится в текущем году, используйте DB CUR, в противном случае используйте годовой БД (2011, 2010, 2009, ...).

Теперь было время, когда люди говорили мне, что повторное создание SessionFactory снова и снова является довольно дорогостоящим делом, поэтому я подумал про себя, что должен существовать способ использования существующего sessionFactory, Update my ClassMap (что-то вроде изменения схемы от «CUR.DBO» до «2011.DBO») и снова подключаться.

Я пытался возиться с обеими FluentConfiguration и SessionFactory, но тогда я взял стрелу в колене не мог найти способ, чтобы обновить отображения во время выполнения.

Смогу ли я создать новый SessionFactory? Или кто-нибудь там знает жизнеспособную процедуру для повторной инициализации (Fluent) сопоставлений NHibernate во время выполнения?

EDIT: Одна очень важная деталь, SqlConnection также предоставляется снаружи. Он обеспечивает доступ ко всем базам данных, а это значит, что теоретически мне никогда не придется создавать Connections. Итак, в основном, мне нужно создать SessionFactory для каждого архива, чтобы обновить информацию схемы Mapping, указывая на другую базу данных. Но это именно то место, где я застрял.

+1

Почему бы не создать 2 сеансовых фабрики? Один для базы данных архива и один для производственной базы данных. –

+0

У нас есть один архив в год, поэтому я, по крайней мере, создаю примерно 10.Это в основном то, что, насколько мне известно, мне придется делать, но, надеюсь, есть более умный способ ... –

ответ

1

Спасибо за ваши ответы/комментарии. На самом деле я не нашел способ повторного использования фабрики сеансов, поэтому я создал список поиска для них, как было предложено. Следующее решение делает то, что мне нужно (изменить базу данных), мы будем, как он выполняет:

private IDictionary<string, ISessionFactory> _sessionFactories; 

    public SqlConnection Connection { get; set; } 

    public ISessionFactory GetSessionFactory(string dbName) 
    { 
     if (_sessionFactories.ContainsKey(dbName)) 
     { 
      return _sessionFactories[dbName]; 
     } 

     FluentConfiguration cfg = Fluently.Configure().Database(MsSqlConfiguration.MsSql2008 
                   .ShowSql() 
                   .ConnectionString(c=>c.Is(Connection.ConnectionString))) 
                 .Mappings(x=>x.FluentMappings.Add<MappedClassMap>()); 
     cfg.ExposeConfiguration(x => x.GetClassMapping(typeof(MappedClass)).Table.Schema = string.Format("{0}.dbo",dbName)); 
     ISessionFactory sf = cfg.BuildSessionFactory(); 
     _sessionFactories.Add(dbName, sf); 
     return sf; 
    } 
1

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

Однако, по моему опыту, это занимает всего несколько секунд.

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

И как только вы создали один год, вы можете его повторно использовать, если в тот же год больше запросов, поэтому им нужно будет только один раз в год запрашивать.

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

0

Кажется, это достаточно, если SessionFactory создан для одной БД. Но при открытии сеанса с экземпляром Sessionfactory доступен перегруженный метод, чтобы предоставить объект dbconnection, где мы можем переключать DB. Проверьте его, и он работает нормально.

 Смежные вопросы

  • Нет связанных вопросов^_^