Я ввел отображение для бизнеса-объекта, который имеет (среди прочих) свойства под названием «Имя»:NHibernate непреднамеренного ленивого свойство загрузка
public class Foo : BusinessObjectBase
{
...
public virtual string Name { get; set; }
}
По какой-то причине, когда я принести «Foo» объекты, NHibernate кажется, применить ленивым свойство загрузки (для простых свойств, а не ассоциации):
следующий кусок кода генерирует п + 1 операторы SQL, о котором первый только распаковывает идентификаторы, а остальные п Позовите Имя для каждой записи:
ISession session = ...IQuery query = session.CreateQuery(queryString);
ITransaction tx = session.BeginTransaction();
List<Foo> result = new List<Foo>();
foreach (Foo foo in query.Enumerable())
{
result.Add(foo);
}
tx.Commit();
session.Close();
производит:
select foo0_.FOO_ID as col_0_0_ from V1_FOO foo0_
SELECT foo0_.FOO_ID as FOO1_2_0_, foo0_.NAME as NAME2_0_ FROM V1_FOO foo0_
WHERE foo0_.FOO_ID=:p0;:p0 = 81
SELECT foo0_.FOO_ID as FOO1_2_0_, foo0_.NAME as NAME2_0_ FROM V1_FOO foo0_
WHERE foo0_.FOO_ID=:p0;:p0 = 36470
SELECT foo0_.FOO_ID as FOO1_2_0_, foo0_.NAME as NAME2_0_ FROM V1_FOO foo0_
WHERE foo0_.FOO_ID=:p0;:p0 = 36473
Аналогично, следующий код приводит к LazyLoadingException после закрытия сеанса:
ISession session = ...
ITransaction tx = session.BeginTransaction();
Foo result = session.Load<Foo>(id);
tx.Commit();
session.Close();
Console.WriteLine(result.Name);
После this post, «ленивых свойствами. .. редко является важной функцией для включения ... (и) в Hibernate 3, по умолчанию отключена ».
Так что я делаю неправильно? Мне удалось обойти LazyLoadingException, сделав NHibernateUtil.Initialize(foo)
, но еще хуже - это n + 1 sql-заявления, которые приносят мое приложение на колени.
Это, как отображение выглядит следующим образом:
<class name="Foo" table="V1_FOO">
...
<property name="Name" column="NAME"/>
</class>
КСТАТИ: Абстрактный базовый «BusinessObjectBase» класс инкапсулирует свойство ID, который служит в качестве внутреннего идентификатора.
какая версия NHibernate вы используете? – Jaguar
2.1.2.4000; hmm thats <3. Угадайте, что ленивые свойства еще не поддерживаются в этой версии? В любом случае, как сказал Стефан, проблема связана не с ленивой загрузкой имущества. – chiccodoro
обновил мой ответ с помощью образцов кода и дальнейших предложений. –