Utilisation du modèle AutoPersistenceModel de Fluent NHibernate mais avec un chargement rapide dans un seul objet
-
05-07-2019 - |
Question
J'utilise Fluent NHibernate afin de mapper automatiquement mes entités.
Voici le code que j'utilise pour le mappage automatique:
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())
);
Cela fonctionne très bien. Mais maintenant, je dois avoir Eager Loading dans un seul objet de mon domaine. cette réponse . Mais lorsque j'ajoute la ligne .ForTypesThatDeriveFrom<IEagerLoading>(map => map.Not.LazyLoad())
au code et que je l'exécute, j'obtiens l'exception suivante:
- Erreur lors de la tentative de création du document de mappage pour IEagerLoading
Notez que j'utilise une interface (IEagerLoading
) pour marquer les objets que je veux charger avec impatience.
Quelqu'un peut-il aider à faire cela? N'oubliez pas que je souhaite conserver la fonctionnalité de mappage automatique.
Merci
La solution
Le problème que vous rencontrez est que ForTypesThatDeriveFrom<T>
est un peu trompeur, et que cela signifie vraiment ForMappingsOf<T>
, donc il essaie de trouver un ClassMap<IEagerLoading>
qui n'existe évidemment pas.
Je pense que vous devriez pouvoir gérer cela avec une coutume IClassConvention
. C’est hors de propos, mais ça devrait marcher:
public class EagerLoadingConvention : IClassConvention
{
public bool Accept(IClassMap target)
{
return GetType().GetInterfaces().Contains(typeof(IEagerLoading));
}
public void Apply(IClassMap target)
{
target.Not.LazyLoad();
}
}