Я только что начал использовать NHibernate, и у меня есть некоторые проблемы, которые я не уверен, как правильно решать.Сессии NHibernate - какой общий способ обработки сеансов в приложениях Windows?
Я начал создавать общий репозиторий, содержащий CUD и пару методов поиска. Каждый из этих методов открывает отдельный сеанс (и транзакцию, если необходимо) во время операций (ов) БД. Проблема при выполнении этого (насколько я могу судить) заключается в том, что я не могу воспользоваться ленивой загрузкой связанных коллекций/объектов.
Поскольку почти любое отношение сущности имеет .Not.LazyLoad()
при свободном сопоставлении, это приводит к загрузке всей базы данных, когда я запрашиваю список всех объектов данного типа.
Поправьте меня, если я ошибаюсь, потому что я до сих пор полный новичок, когда дело доходит до NHibernate :)
Что является наиболее распространенным, чтобы сделать, чтобы избежать этого? Есть ли один глобальный статический сеанс, который остается в живых до тех пор, пока программа запускается, или что мне делать?
Часть кода репозитория:
public T GetById(int id)
{
using (var session = NHibernateHelper.OpenSession())
{
return session.Get<T>(id);
}
}
Использование хранилища, чтобы получить человек
var person = m_PersonRepository.GetById(1); // works fine
var contactInfo = person.ContactInfo; // Throws exception with message:
// failed to lazily initialize a collection, no session or session was closed
Спасибо за ваш ответ. Я прочитал главу из документации, но я до сих пор не совсем понимаю, что вы подразумеваете во втором предложении. Вы имеете в виду, что мне нужно держать сессию, если мне нужно получить доступ к ленивым загруженным свойствам? Я добавлю часть моего кода репозитория на вопрос. – l3dx
Конечно - добавьте некоторый контекст к вопросу, и я рассмотрю его более конкретно в ответе. –
Ницца, спасибо большое! +1 Я буду реорганизовывать мой репозиторий тогда :) Мое понимание состоит в том, что материал session/db должен быть «удален» от реального приложения, поэтому, если я дополнительно удалю его из репозитория, где бы я его разместил? – l3dx