Кто-нибудь знает, почему я получаю это предупреждение от NHibernate/NH Profiler?
Msgstr "Отключено извлечение ленивых свойств для 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);
});
}
2 ответа
InvoicePreference упоминается как hasone. Так как по умолчанию он загружен, NHibernate создаст прокси для заполнения свойства InvoicePreference и для этого ему потребуется идентификатор из InvoicePreference, которого нет в подгруппе. Для этого он должен запросить его, используя свойство в propertyref.
Чтобы исправить это сделать .Not.LazyLoad()
и / или .Fetch.Join()
Я предполагаю, что есть какая-то причина, по которой NH отключил ленивую загрузку "на уровне сущности", которую я понимаю как не создающую прокси. Для этого может быть несколько причин. Вы получили еще одно предупреждение раньше? Я не очень понимаю, почему он отключил "ленивые свойства", что означает, что некоторые свойства загружаются лениво. Это функция, которая явно используется в отображении, но я не вижу ничего подобного в ваших определениях сопоставления.
Чтобы преодолеть N+1, вы можете использовать Fetch.Join. У меня был плохой опыт с этим, потому что запросы становятся действительно большими. В сложной модели вы можете ограничить некоторые ограничения сервера базы данных (например, максимальное количество столбцов запроса). В основном лучше использовать размер пакета, что значительно уменьшает количество запросов. Взгляните на мой ответ " Ленивая загрузка эталонной сущности Nhinerbate".