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

War es hilfreich?

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();
  }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top