Использование AutoPersistenceModel в Fluent NHibernate, но с энергичной загрузкой в ​​одном объекте - PullRequest
0 голосов
/ 05 мая 2009

Я использую 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), чтобы отмечать объекты, которые я хочу загружать.

Может кто-нибудь помочь, как это сделать? Помните, что я хочу сохранить функцию автоматического сопоставления.

Спасибо

1 Ответ

3 голосов
/ 05 мая 2009

Проблема, с которой вы столкнулись, состоит в том, что 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();
  }
}
...