NHibernate LazyLoading - PullRequest
       12

NHibernate LazyLoading

1 голос
/ 15 марта 2011

Для проекта ASP.Net я использую (Свободно) NHibernate для персистентности и JQGrid для отображения данных в таблице. Но когда я хочу использовать функцию автозаполнения JQGrid, я получаю System.ArgumentException: Column 'HibernateLazyInitializer' does not belong with this table. при получении данных в запросе AJAX. Но эта ошибка возникает только время от времени, и когда какой-то прокси-класс используется в списке. Поэтому я думаю, что это как-то связано с ленивой загрузкой NHibernate.

protected new void Page_Load(object sender, EventArgs e)
  {
     base.Page_Load(sender, e);
     _jqAutoComplete.DataSource = Session.CreateCriteria<Domain.Brand>()
            .List<Domain.Brand>();
     _jqAutoComplete.DataBind();
  }

Обычно ленивая загрузка - довольно крутая функция. Только в этом случае это приводит к ошибке, и поэтому я не хочу отключать ее во всем проекте. Итак, есть ли способ изменить CreateCriteria, чтобы не использовать LazyLoading, а EagerLoading в этом случае? Или я что-то пропустил? Если есть хороший урок для понимания LazyLoading, я тоже был бы рад.

1 Ответ

1 голос
/ 18 марта 2011

Я решил проблему по-другому. Теперь я конвертирую Domain-Object в соответствующий объект из ViewModel. Я использую ValueInjecter для выполнения сопоставления.

protected new void Page_Load(object sender, EventArgs e)
  {
     base.Page_Load(sender, e);

     var objList = service.getList<Domain.Brand>();
     IList<V> list = new List<ViewModel.Brand>();

     foreach (var el in objList)
     {
        var brand = new ViewModel.Brand();
        list.Add(brand.InjectFrom<FlatLoopValueInjection>(el));
     }

     _jqAutoComplete.DataSource = list;
     _jqAutoComplete.DataBind();
  }

Это решение работает для меня, но я не совсем доволен этим.

...