“禁用了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);
    });
}

最佳答案

InvoicePreference引用为hasone。由于默认情况下是延迟加载的,因此NHibernate将创建一个代理来填充属性InvoicePreference,并为此需要来自InvoicePreference的标识,该标识在子组中不存在。因此,它必须使用propertyref中的属性进行查询。

为了弥补该问题,.Not.LazyLoad()和/或.Fetch.Join()

关于c# - 有谁知道为什么我会从NHibernate/NH Profiler得到这个警告?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11460062/

10-10 02:34