Fluent NHibernate N + 1 Problem mit komplexen Objekten

Ich habe ein Problem damit, dass NHibernate die Datenbank viel zu oft abfragt. Ich habe gerade festgestellt, dass es wahrscheinlich mit dem n + 1-Problem zusammenhängt, kann aber nicht herausfinden, wie ich meine Zuordnungen ändern kann, um das Problem zu lösen.

ie Sie sehen werden, besteht mein Versuch darin, anzugeben, dass andere Objekte nicht faul geladen werden sollen, aber es scheint nicht zu funktioniere

Dies ist die Abfrage:

public IQueryable<Report> ReadAll(DateTime since)
{
    return m_session.QueryOver<Report>()
       .JoinQueryOver(r => r.Mail)
       .Where(m => m.Received >= since)
       .List()
       .AsQueryable();
}

Vielen Dank im Voraus für jede Antwort! Wenn Sie weitere Informationen zu meinen Objekten oder Zuordnungen benötigen, teilen Sie mir dies bitte mit.

Vereinfachtes Objektdiagramm (einige weggelassen):

public class Report : EntityBase
{
    public virtual Product Product { get; set; }
    public virtual StackTrace StackTrace { get; set; }
    public virtual Mail Mail { get; set; }

    public virtual IList<ClientUser> ReadBy { get; set; }
}

-

public class Product : EntityBase
{
    public virtual string Name { get; set; }
    public virtual Version Version { get; set; }
    public virtual IList<Report> Reports { get; set; }
    public virtual IList<StackTrace> StackTraces { get; set; }
}

-

public class StackTrace : EntityBase
{
    public virtual IList<StackTraceEntry> Entries { get; set; }
    public virtual IList<Report> Reports { get; set; }
    public virtual Product Product { get; set; }
}

Mapping-Beispiele:

public class ReportMap : ClassMap<Report>
{
    public ReportMap()
    {
        Table("Report");

        References(x => x.User)
          .Column("EndUserId")
          .Not.LazyLoad();

        References(x => x.Product)
          .Column("ProductId")
          .Not.LazyLoad();

        References(x => x.StackTrace)
          .Column("StackTraceId")
          .Not.LazyLoad();

        HasManyToMany(x => x.ReadBy)
          .Cascade.SaveUpdate()
          .Table("ClientUserRead")
          .ParentKeyColumn("ReportId")
          .ChildKeyColumn("ClientUserId")
          .Not.LazyLoad().BatchSize(200);
    }
}

-

public class StackTraceMap : ClassMap<StackTrace>
{
    public StackTraceMap()
    {
        Table("StackTrace");

        References(x => x.Product)
          .Column("ProductId");

        HasMany(x => x.Entries)
          .KeyColumn("StackTraceId")
          .Not.LazyLoad()
          .Cascade
          .All().BatchSize(500);

        HasMany(x => x.Reports)
          .KeyColumn("StackTraceId")
          .Inverse().BatchSize(100);
    }
}

Antworten auf die Frage(4)

Ihre Antwort auf die Frage