3

「エンティティ レベルで遅延をサポートしていないため、full_qualified_type_name の遅延プロパティ フェッチを無効にしました」。

この警告は NH Profiler によって報告されたもので、その結果、恐ろしい SELECT N + 1 の副作用が発生しています。したがって、2200 個のサブグループ エンティティが返された場合、各InvoicePreferenceエンティティを取得するために追加のクエリが実行されます (合計 2201 個のクエリ)。その関係の何かが問題を引き起こしているようです。

問題のエンティティとそれぞれのマッピングは次のとおりです。

エンティティ 1

public class Subgroup : Entity
{
     public virtual string GroupNumber { get; set; }

     public virtual string RUSNumber { get; set; }

     public virtual string REANumber { get; set; }

     public virtual string CustomerType { get; set; }

     public virtual string Name { get; set; }

     public virtual IList<IndividualEmployment> Employees { get; set; }

     public virtual IList<BenefitsAdministrator> Administrators { get; set; }

     public virtual InvoicePreference InvoicePreference { get; set; }
}

エンティティ 2

public class InvoicePreference : IEntity
{
    public virtual Guid Id { get; set; }

    public virtual Guid SubgroupId { get; set; }

    public virtual bool PaperlessNotifications { get; set; }
}

マッピング 1

public static AutoPersistenceModel ConfigureSubGroup(this AutoPersistenceModel 
autoPersistenceModel)
{
    return autoPersistenceModel.Override<Subgroup>(map =>
    {
        map.Table("SubgroupV");

        map.Id(s => s.Id).Column(SubGroupPrimaryKeyColumn);

        map.Map(s => s.CustomerType, "BAS_Customer_Type");
        map.Map(s => s.RUSNumber, "BAS_RUS_Number");
        map.Map(s => s.GroupNumber, "BAS_Group_Number");
        map.Map(s => s.REANumber, "BAS_REA_Number");

        map.HasMany(s => s.Administrators).KeyColumn(SubGroupPrimaryKeyColumn);
        map.HasMany(s => s.Employees).KeyColumn(SubGroupPrimaryKeyColumn);
        map.HasOne(s => s.InvoicePreference).PropertyRef(i => i.SubgroupId);
    });
}

マッピング 2

public static AutoPersistenceModel ConfigureInvoicePreference(this AutoPersistenceModel autoPersistenceModel)
{
    return autoPersistenceModel.Override<InvoicePreference>(map =>
    {
        map.Table("SubgroupInvoicePreference");
        map.Schema(RetirementStatementsSchemaName);
    });
}
4

2 に答える 2

1

NHが「エンティティレベルで」遅延読み込みを無効にした理由はいくつかあると思いますが、これはプロキシを作成していないと私は理解しています。それにはいくつかの理由が考えられます。以前に別の警告が表示されましたか?「遅延プロパティ」が無効になっている理由がよくわかりません。つまり、一部のプロパティが遅延ロードされます。これはマッピングで明示的に使用される機能ですが、マッピング定義にこのようなものが表示されません。

N + 1を克服するには、Fetch.Joinを使用できます。クエリが非常に大きくなるので、私はそれについて悪い経験をしました。複雑なモデルでは、データベースサーバーの制限(クエリの最大列数など)に達する可能性があります。バッチサイズを使用することをお勧めします。これにより、クエリの数が大幅に減少します。「参照エンティティのNhinerbate遅延読み込みに対する私の答えを見てください。

于 2012-07-13T06:55:54.607 に答える
1

InvoicePreference は hasone として参照されます。デフォルトで遅延ロードされるため、NHibernate はプロパティ InvoicePreference を入力するプロキシを作成します。そのためには、サブグループに存在しない InvoicePreference からの ID が必要です。そのため、propertyref のプロパティを使用してクエリを実行する必要があります。

そのことを改善するため.Not.LazyLoad()、および/または.Fetch.Join()

于 2012-07-13T06:33:21.807 に答える