Используя Fluent NHibernate AutoPersistenceModel, но с быстрой загрузкой в один объект
-
05-07-2019 - |
Вопрос
Я использую Fluent NHibernate для автоматического сопоставления моих объектов.
Это код, который я использую для автоматического сопоставления:
new AutoPersistenceModel()
.AddEntityAssembly(Assembly.GetAssembly(typeof(Entity)))
.Where(type => type.Namespace.Contains("Domain") && type.BaseType != null && type.BaseType.Name.StartsWith("DomainEntity") && type.BaseType.IsGenericType == true)
.WithSetup(s => s.IsBaseType = (type => type.Name.StartsWith("DomainEntity") && type.IsGenericType == true))
.ConventionDiscovery.Add(
ConventionBuilder.Id.Always(x => x.GeneratedBy.Increment())
);
Это работает просто отлично.Но теперь мне нужно обеспечить быструю загрузку в одном-единственном объекте моего домена.Найденный этот ответ.Но когда я добавляю строку .ForTypesThatDeriveFrom<IEagerLoading>(map => map.Not.LazyLoad())
к коду и запускаю его, я получаю следующее исключение:
- Ошибка при попытке создать документ сопоставления для IEagerLoading
Обратите внимание, что я использую интерфейс (IEagerLoading
) чтобы отметить объекты, которые я хочу нетерпеливо загрузить.
Кто-нибудь может помочь, как это сделать?Помните, что я хочу сохранить функциональность автоматического сопоставления.
Спасибо
Решение
Проблема, с которой вы сталкиваетесь, заключается в том, что ForTypesThatDeriveFrom<T>
немного вводящее в заблуждение название, и что это действительно означает ForMappingsOf<T>
, таким образом , он пытается найти ClassMap<IEagerLoading>
которого, очевидно, не существует.
Я считаю, что вы должны быть в состоянии справиться с этим с помощью пользовательского IClassConvention
.Это не укладывается у меня в голове, но должно сработать:
public class EagerLoadingConvention : IClassConvention
{
public bool Accept(IClassMap target)
{
return GetType().GetInterfaces().Contains(typeof(IEagerLoading));
}
public void Apply(IClassMap target)
{
target.Not.LazyLoad();
}
}