【发布时间】:2012-07-13 23:13:51
【问题描述】:
“为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);
});
}
【问题讨论】:
-
这是来自 NH profiler 的确切消息吗?
-
这不是确切的信息。它具有类型的实际名称。警告:禁用 Neb.RetirementStatements.Services.Domain.Subgroup 的惰性属性获取,因为它不支持实体级别的惰性
-
似乎与这个问题有关。 stackoverflow.com/questions/4888140/…
标签: c# .net nhibernate lazy-loading nhprof