2011-01-27 5 views
0

Я получаю закрытое исключение Nhibernate Session с asp.net mvc telerik ajax grid. Сетка привязана к объекту Sales, у которого есть связанный пользователь. Исключение составляет попытка получить доступ к объекту User. Я использовал fetchMode для его загрузки, но все равно получаю то же исключение. Это исключение возникает только в том случае, если я переключаюсь между страницами сетки несколько раз. Кто-нибудь столкнулся с этой проблемой?Nhibernate Сессия закрытого исключения с Asp.net mvc telerik ajax grid

Код для этого доступа к данным является следующим:

public IList<Sale> List() 
     { 
      var manager = new ManagerFactory().GetSaleManager(); 
      var iCriteria = manager.Session.GetISession().CreateCriteria(typeof(Sale)) 
       .SetFetchMode("AspnetUser3.Agents3", FetchMode.Eager); 

      return iCriteria.List<Sale>(); 
     } 

код, которые пытаются получить доступ связанный объект в графе объектов выглядит следующим образом:

AgentId = sale.AspnetUser3.Agents3[0].Id, 

Исключение брошенной

NHibernate.Exceptions.GenericADOException: could not load an entity: [SalesEntry.Data.Model.AspnetUser#7aaabf99-d77d-4edf-b949-9c4c0f3e85d8][SQL: SELECT aspnetuser0_.[UserId] as column1_12_0_, aspnetuser0_.[UserName] as column2_12_0_, aspnetuser0_.[LoweredUserName] as column3_12_0_, aspnetuser0_.[MobileAlias] as column4_12_0_, aspnetuser0_.[IsAnonymous] as column5_12_0_, aspnetuser0_.[LastActivityDate] as column6_12_0_, aspnetuser0_.[ApplicationId] as column7_12_0_ FROM [dbo].[aspnet_Users] aspnetuser0_ WHERE aspnetuser0_.[UserId]=?] ---> System.ObjectDisposedException: Session is closed! 
Object name: 'ISession'. 
+2

Возможно ли, что один из объектов, на которые ссылается объект User, загружается лениво? Например, Пользователь ссылается на объект Locale/Address, который не был загружен с нетерпением. Кроме того, какой тип модели управления сеансом вы используете (например, сеанс на запрос и т. Д.)? – saret

+0

@Saret: Я использую шаблон кода codemith 1.7, который для каждого запроса создается сеанс. – odez213

ответ

1

Это происходит из-за того, что пользователь ленится, и вы, вероятно, видите ситуацию, когда ssion закрывается до загрузки объекта User. Затем, когда Grid обращается к ссылке User, вы получаете это исключение. Убедитесь, что вы следуете за Unit of Work pattern.

Также вы можете использовать класс модели для привязки к своей сетке, а не непосредственно к объекту. Таким образом, вы контролируете, какой доступ делается, и избегаете неожиданных изменений в ваших сущностях/базе данных.

+0

@ Яд: это то, что я вижу, что он ленивый. Моя головоломка: я установил, что моя icriteria имеет fetchMode.Eager для пользователя Entity. Должен ли я сбросить свой призыв, чтобы его загрузить? Также +1 для вашего ответа – odez213

+0

@ odez213, FetchModel.Eager извлекает объект пользователя через внешнее соединение. Вы можете видеть, что генерируется SQL? Существует ли потенциально ленивая ссылка на объект User, к которому обращаются? – Vadim

+0

@ Яд вещь исключение возникает только в том случае, если я очень быстро нажимаю на пейджинг на сетке телериков. Первая инициализация и умеренное время нажатия на пейджинг прекрасны. В сетке telerik используется Ajax. Эта проблема возникает в процессе производства, и я могу реплицировать проблему в dev. Я начинаю думать, что это связано с вызовом ajax telerik grid. Позднее я выложу некоторый код и исключение msg. – odez213

Смежные вопросы