Быстрый NHibernate + несколько баз данных

Мой проект должен обработать три базы данных, который означает три фабрики сессии. Вещь состоит в том, если я делаю что-то вроде этого с быстрым nhibernate:

.Mappings(m => m.FluentMappings.AddFromAssembly(Assembly.GetExecutingAssembly()))

фабрики взяли бы все отображения, даже те, которые соответствуют другой базе данных

Я видел, что при использовании автоотображения можно сделать что-то вроде этого, и фильтровать пространством имен:

.Mappings(m => m.AutoMappings.Add(
    AutoMap
       .AssemblyOf<Product>()
       .Where(t => t.Namespace == "Storefront.Entities")))

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

Я предпочел бы избегать обоих, если это возможно.Спасибо.

9
задан Groo 4 August 2010 в 01:45
поделиться

2 ответа

Я реализовал именно это, используя (свой собственный) атрибут в файле сопоставления Fluent, чтобы указать, к какой БД принадлежит объект. У меня также есть концепция базы данных по умолчанию, и файлы сопоставления без атрибута предполагается, что они находятся в БД по умолчанию (это может сократить количество классов, которые вам нужно декорировать). Затем у меня есть код инициализации, который создает фабрику сеансов для каждой базы данных и для каждой из них использует отражение, чтобы найти все ClassMap проверяет атрибут, чтобы определить, какой БД он принадлежит, и соответственно регистрирует каждую ClassMap.

Пример файла сопоставления:

  [FluentNHibernateDatabase("MySecurityDatabase")]
  public class SystemUserMap : ClassMap<SystemUser>
  {
    public SystemUserMap()
    {
      Id(x => x.SystemUserId);
      Map(x => x.LoginId);
      Map(x => x.LoginPassword);
      Map(x => x.UserFirstName);
      Map(x => x.UserSurname);
      References(x => x.UserOrganisation, "OrganisationId");
    }
  }

Очевидно, я определил список баз данных, на которые ссылаются / используются.
Моя реализация работает, насколько я понимаю, но я наткнулся на загвоздку (надеюсь, кто-то может помочь с ней):

Я задал свой вопрос здесь: { {1}} Как определить фабрику сеансов конкретной сущности с помощью Fluent NHibernate и нескольких баз данных

6
ответ дан 3 November 2019 в 00:00
поделиться

Вы также можете фильтровать по типам. Вот строка закомментированного кода из AutoPersistenceModel «зеленого поля», который я использую в той же сборке, что и «коричневый поле один» (т. Е. Две базы данных). Но есть только один тип, по которому мне нужно фильтровать, поэтому я не удосужился разделить устаревшую сборку. Если у вас их много на db, то разделение их по сборкам, вероятно, будет лучшим IMO.

Было бы здорово, если бы FNH мог предоставить какую-то встроенную поддержку нескольких баз данных, но я не знаю, как это действительно можно сделать; Может быть, какой-то словарь SessionFactories, но каждая ситуация уникальна.

HTH,
Беррил

    /// <summary>
    /// This would simply call <see cref="AutoMapHelpers.GetAutoMappingFilter"/> but we need to 
    /// exclude <see cref="LegacyProject"/> also for now.
    /// </summary>
    private static bool _getIncludedTypesFilter(Type t) {
        return _isNotLegacy(t) && AutoMapHelpers.GetAutoMappingFilter(t);
    }
    private static bool _isNotLegacy(Type t) { return !t.Equals(typeof(LegacyProject)); }
1
ответ дан 3 November 2019 в 00:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: