“禁用懒惰属性获取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);
});
}
答案 0 :(得分:1)
InvoicePreference被引用为hasone。由于默认情况下它是延迟加载的,因此NHibernate将创建一个代理来填充属性InvoicePreference,并且为此需要来自InvoicePreference的标识,该标识在子组中不存在。因此,它必须使用propertyref中的属性来查询它。
要解决.Not.LazyLoad()
和/或.Fetch.Join()
答案 1 :(得分:1)
我想有一些原因可以解释为什么NH在实体级别禁用了延迟加载,我理解这不是创建代理。可能有几个原因。你之前有过另一个警告吗?我真的不明白为什么它禁用了“lazy properies”,这意味着某些属性是延迟加载的。这是一个明确用于映射的功能,但我在映射定义中看不到这样的内容。
要克服N + 1,您可以使用Fetch.Join。我对此有不好的经验,因为查询变得非常大。在复杂模型中,您可以达到某些数据库服务器限制(例如查询的最大列数)。最好使用批量大小,这显着减少了查询的数量。请查看my answer至“Nhinerbate lazy loading of reference entity”。