Usando AutoPersistenceModel de Fluent NHibernate, mas com carga antecipada em um único objeto
-
05-07-2019 - |
Pergunta
Eu estou usando Fluent NHibernate, a fim de auto mapear meus entidades.
Este é o código que estou usando para o mapeamento automático:
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())
);
Isso funciona muito bem. Mas agora eu preciso ter Eager Loading em um único objeto do meu domínio. Encontrado esta resposta . Mas quando eu adiciono o .ForTypesThatDeriveFrom<IEagerLoading>(map => map.Not.LazyLoad())
linha para o código e executá-lo eu recebo a seguinte exceção:
- Erro ao tentar construir o documento de mapeamento para IEagerLoading
Observe que eu estou usando uma interface (IEagerLoading
) para marcar os objetos que eu quero carga ansioso.
alguém pode ajudar como fazer isso? Lembre-se que eu quero manter a funcionalidade de mapeamento automático.
Graças
Solução
O problema que você está batendo é que ForTypesThatDeriveFrom<T>
é um pouco enganosamente chamado, e que realmente significa ForMappingsOf<T>
, por isso está tentando encontrar um ClassMap<IEagerLoading>
que obviamente não existe.
Eu acredito que você deve ser capaz de lidar com isso com um IClassConvention
personalizado. Esta é em cima da minha cabeça, mas deve funcionar:
public class EagerLoadingConvention : IClassConvention
{
public bool Accept(IClassMap target)
{
return GetType().GetInterfaces().Contains(typeof(IEagerLoading));
}
public void Apply(IClassMap target)
{
target.Not.LazyLoad();
}
}