Мой проект должен обработать три базы данных, который означает три фабрики сессии. Вещь состоит в том, если я делаю что-то вроде этого с быстрым nhibernate:
.Mappings(m => m.FluentMappings.AddFromAssembly(Assembly.GetExecutingAssembly()))
фабрики взяли бы все отображения, даже те, которые соответствуют другой базе данных
Я видел, что при использовании автоотображения можно сделать что-то вроде этого, и фильтровать пространством имен:
.Mappings(m => m.AutoMappings.Add(
AutoMap
.AssemblyOf<Product>()
.Where(t => t.Namespace == "Storefront.Entities")))
Я не нашел ничего как это для быстрых отображений, действительно ли это возможно?? Единственные решения, о которых я могу думать: или создайте отдельные блоки для каждого отображения дб классы или явно добавления каждого из объектов к конфигурации фабрики.
Я предпочел бы избегать обоих, если это возможно.Спасибо.
Я реализовал именно это, используя (свой собственный) атрибут в файле сопоставления 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 и нескольких баз данных
Вы также можете фильтровать по типам. Вот строка закомментированного кода из 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)); }