2009-05-05 7 views
0

Я использую Fluent NHibernate, чтобы автоматически отображать объекты.Использование Fluent NHibernate в AutoPersistenceModel, но с энергичной загрузкой в ​​одном объекте

Это код, я использую для автоматического отображения:

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()) 
); 

Это работает просто отлично. Но теперь мне нужно иметь Eager Loading в одном объекте моего домена. Найдено this answer. Но когда я добавить строку .ForTypesThatDeriveFrom<IEagerLoading>(map => map.Not.LazyLoad()) в код и запустить его, я получаю следующее исключение:

  • Ошибка при попытке создать отображение документа для IEagerLoading

Обратите внимание, что я использую интерфейс (IEagerLoading), чтобы отметить объекты, которые я хочу получить.

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

Благодаря

ответ

3

вы удара проблема заключается в том, что 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(); 
    } 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^