2009-05-05 9 views
0

Ich verwende Fluent NHibernate, um meine Entitäten automatisch zuzuordnen.Verwenden des AutoPersistenceModel von Fluent NHibernate, aber mit eifrigem Laden in einem einzelnen Objekt

Dies ist der Code, den ich für das 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()) 
); 

Das funktioniert ganz gut. Aber jetzt muss ich Eager Loading in einem einzigen Objekt meiner Domain haben. Gefunden this answer. Aber wenn ich die Linie .ForTypesThatDeriveFrom<IEagerLoading>(map => map.Not.LazyLoad()), um den Code hinzuzufügen und führen Sie es erhalte ich die folgende Ausnahme:

  • Fehler beim Versuch, das Mapping-Dokument für IEagerLoading

Hinweis zu bauen, dass ich mit einer Schnittstelle (IEagerLoading) um die Objekte zu markieren, die ich gerne laden möchte.

Kann jemand helfen, wie man das macht? Denken Sie daran, dass ich die automatische Zuordnungsfunktion beibehalten möchte.

Dank

Antwort

3

Das Problem, das Sie schlagen sind, ist, dass ForTypesThatDeriveFrom<T> ein bisschen irreführend genannt ist, und dass es wirklich bedeutet, ForMappingsOf<T>, so dass er versucht, ein ClassMap<IEagerLoading> zu finden, die offensichtlich nicht existiert.

Ich glaube, Sie sollten dies mit einer benutzerdefinierten IClassConvention umgehen können. Dies ist von der Spitze meines Kopfes, aber sollte funktionieren:

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

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