3

“为fully_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 的标识,该标识不存在于子组中。因此它必须使用 propertyref 中的属性来查询它。

补救这样做.Not.LazyLoad()和/或.Fetch.Join()

于 2012-07-13T06:33:21.807 回答