Используя Fluent NHibernate AutoPersistenceModel, но с быстрой загрузкой в один объект

StackOverflow https://stackoverflow.com/questions/825474

Вопрос

Я использую 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();
  }
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top