2009-05-05 5 views
0

J'utilise Fluent NHibernate pour mapper automatiquement mes entités.Utilisation de AutoPersistenceModel de NHibernate fluide mais avec un chargement rapide dans un seul objet

C'est le code que je 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 j'ai besoin d'avoir Eager Chargement dans un seul objet de mon domaine. Trouvé this answer. Mais quand j'ajoute la ligne .ForTypesThatDeriveFrom<IEagerLoading>(map => map.Not.LazyLoad()) au code et l'exécuter, je reçois l'exception suivante:

  • Erreur tout en essayant de construire le document de cartographie pour IEagerLoading

Notez que j'utilise un interface (IEagerLoading) pour marquer les objets que je veux charger avec impatience.

Quelqu'un peut-il aider à faire cela? Rappelez-vous que je veux conserver la fonctionnalité de cartographie automatique.

Merci

Répondre

3

Le problème que vous frapper est que ForTypesThatDeriveFrom<T> est un peu trompeusement nommé, et que cela signifie vraiment ForMappingsOf<T>, donc il essaie de trouver un ClassMap<IEagerLoading> qui évidemment n'existe pas.

Je crois que vous devriez être en mesure de gérer cela avec un IClassConvention personnalisé. C'est sur le dessus de ma tête, mais devrait fonctionner:

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

    public void Apply(IClassMap target) 
    { 
    target.Not.LazyLoad(); 
    } 
} 
Questions connexes