Pregunta

Estoy usando NHibernate fluido para asignar automáticamente mis entidades.

Este es el código que estoy usando para la asignación automática:

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

Esto funciona bien. Pero ahora necesito tener Eager Loading en un solo objeto de mi dominio. Encontramos esta respuesta . Pero cuando agrego la línea .ForTypesThatDeriveFrom<IEagerLoading>(map => map.Not.LazyLoad()) al código y la ejecuto, obtengo la siguiente excepción:

  • Error al intentar crear el documento de mapeo para IEagerLoading

Observe que estoy usando una interfaz (IEagerLoading) para marcar los objetos que quiero cargar con ansias.

¿Alguien puede ayudar a hacer esto? Recuerde que quiero mantener la funcionalidad de mapeo automático.

Gracias

¿Fue útil?

Solución

El problema con el que te encuentras es que ForTypesThatDeriveFrom<T> tiene un nombre un tanto engañoso y que realmente significa ForMappingsOf<T>, por lo que está tratando de encontrar un ClassMap<IEagerLoading> que obviamente no existe.

Creo que deberías poder manejar esto con un IClassConvention personalizado. Esto está fuera de mi cabeza, pero debería funcionar:

public class EagerLoadingConvention : IClassConvention
{
  public bool Accept(IClassMap target)
  {
    return GetType().GetInterfaces().Contains(typeof(IEagerLoading));
  }

  public void Apply(IClassMap target)
  {
    target.Not.LazyLoad();
  }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top