Mit Fluent NHibernate AutoPersistenceModel aber mit eifrigem Laden in einem einzigen Objekt
-
05-07-2019 - |
Frage
Ich bin mit Fluent NHibernate, um Auto-Karte meiner Einheiten.
Dies ist der Code, den ich für das Auto-Mapping bin mit:
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 brauche ich Eager Laden in einem einzigen Gegenstand meiner Domain haben. Gefunden diese Antwort . Aber wenn ich die Linie .ForTypesThatDeriveFrom<IEagerLoading>(map => map.Not.LazyLoad())
, um den Code hinzuzufügen und führen Sie es mir die folgende Ausnahme:
- Fehler beim Versuch, das Mapping-Dokument für IEagerLoading zu bauen
Beachten Sie, dass ich eine Schnittstelle (IEagerLoading
) bin mit den Objekte zu markieren, die ich eifrig Last will.
Kann mir jemand helfen, wie dies zu tun? Denken Sie daran, dass ich die Auto-Mapping-Funktionalität beibehalten möchten.
Danke
Lösung
Das Problem, das Sie schlagen sind, ist, dass ForTypesThatDeriveFrom<T>
ist ein bisschen irreführend genannt, und dass es wirklich bedeutet ForMappingsOf<T>
, so dass er versucht, einen ClassMap<IEagerLoading>
zu finden, die offensichtlich nicht existiert.
Ich glaube, soll es möglich sein, dies mit einem benutzerdefinierten IClassConvention
zu behandeln. Dies ist aus der Spitze von meinem Kopf, sollte aber funktionieren:
public class EagerLoadingConvention : IClassConvention
{
public bool Accept(IClassMap target)
{
return GetType().GetInterfaces().Contains(typeof(IEagerLoading));
}
public void Apply(IClassMap target)
{
target.Not.LazyLoad();
}
}