2009-11-03 4 views
0

Я использую NHibernate для своего проекта. Я довольно новичок в работе над NHibernate.NHibernate многих для многих и ISession.Close()

Я использую отношение «многие-ко-многим», сопоставляющее «пользователи» и «роли». Вот код, чтобы заставить пользователя:

public User GetUser(int userId){ 
    using(ISessuib session = new SessionManager().GetSession()) 
    { 
    return session.Get<User>(userId); 
    } 
} 

public void LazyLoadUsingSessionTest(){ 
    var user= GetUser(1); 
    Assert.NotNull(user.Roels); 
} 

он бросает исключение: не удалось лениво инициализировать коллекцию, не сеанс или сеанс был закрыт

если я не использовать «используя» заявление в методе «GetUser» он работает. Но я должен вызвать session.Close(), чтобы освободить ресурс

, когда я использую его в веб-страницы, я только хочу, чтобы использовать GetUser(), а не ISession object.so мой вопрос: Означает ли это, что у меня должен быть объект ISession (для освобождения resouse) на моей веб-странице? или любое лучшее решение? (потому что я не хочу, чтобы объект ISession появляется в моих файлах aspx.cs)

спасибо!

ответ

2

Вы должны использовать сеанс для каждого запроса шаблона. См. Это link для объяснения лучших практик использования NHibernate с ASPX.

-1

Самый простой способ заключается в использовании NHibernateUtil.Initialize (читай here подробности):

using(ISession session = new SessionManager().GetSession()) 
{ 
    User user = session.Get<User>(userId); 
    NHibernateUtil.Initialize(user.Roles); 
    return user; 
} 

Однако, рано или поздно вам нужно будет каким-то образом управлять сессий в вашем приложении. Я рекомендую создать слой поставщика данных, который даст вам доступ к базе данных. Уровень поставщика данных будет управлять созданием и уничтожением сеансов. У вас может быть сеанс на запрос или на беседу (единая ISession на протяжении сеанса ASP.Net).

Видеокамера Summer Of NHibernate будет полезна. Сессия 5 и 13 наиболее важны для вас.

+0

Извините, но это плохая консультация. Таким образом, вы одновременно уничтожаете ленивую загрузку и транзакционную изоляцию, в то же время взрывая код множеством мусора. –

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