Utilizzo di AutoPersistenceModel di NHibernate fluente ma con caricamento desideroso in un singolo oggetto
-
05-07-2019 - |
Domanda
Sto usando Fluent NHibernate per mappare automaticamente le mie entità.
Questo è il codice che sto usando per l'auto mapping:
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())
);
Funziona bene. Ma ora ho bisogno di avere Eager Loading in un singolo oggetto del mio dominio. Trovato questa risposta . Ma quando aggiungo la riga .ForTypesThatDeriveFrom<IEagerLoading>(map => map.Not.LazyLoad())
al codice ed eseguo ottengo la seguente eccezione:
- Errore durante il tentativo di compilare il documento di mappatura per IEagerLoading
Si noti che sto utilizzando un'interfaccia (IEagerLoading
) per contrassegnare gli oggetti che desidero caricare con impazienza.
Qualcuno può aiutare a fare questo? Ricorda che voglio mantenere la funzionalità di mappatura automatica.
Grazie
Soluzione
Il problema che stai colpendo è che ForTypesThatDeriveFrom<T>
ha un nome un po 'fuorviante e che in realtà significa ForMappingsOf<T>
, quindi sta cercando di trovare un ClassMap<IEagerLoading>
che ovviamente non esiste.
Credo che dovresti essere in grado di gestirlo con un IClassConvention
personalizzato. Questo è fuori dalla mia testa, ma dovrebbe funzionare:
public class EagerLoadingConvention : IClassConvention
{
public bool Accept(IClassMap target)
{
return GetType().GetInterfaces().Contains(typeof(IEagerLoading));
}
public void Apply(IClassMap target)
{
target.Not.LazyLoad();
}
}