Я разрабатываю веб-сайт с ASP.NET MVC, NHibernate и Fluent Hibernate и получаю сообщение об ошибке " Сессия не была закрыта * " при попытке доступа к дочернему объекту.
Это мои доменные классы:
public class ImageGallery {
public virtual int Id { get; set; }
public virtual string Title { get; set; }
public virtual IList<Image> Images { get; set; }
}
public class Image {
public virtual int Id { get; set; }
public virtual ImageGallery ImageGallery { get; set; }
public virtual string File { get; set; }
}
Это мои карты:
public class ImageGalleryMap:ClassMap<ImageGallery> {
public ImageGalleryMap() {
Id(x => x.Id);
Map(x => x.Title);
HasMany(x => x.Images);
}
}
public class ImageMap:ClassMap<Image> {
public ImageMap() {
Id(x => x.Id);
References(x => x.ImageGallery);
Map(x => x.File);
}
}
А это мой вспомогательный класс Session Factory:
public class NHibernateSessionFactory {
private static ISessionFactory _sessionFactory;
private static ISessionFactory SessionFactory {
get {
if(_sessionFactory == null) {
_sessionFactory = Fluently.Configure()
.Database(MySQLConfiguration.Standard.ConnectionString(MyConnString))
.Mappings(m => m.FluentMappings.AddFromAssemblyOf<ImageGalleryMap>())
.ExposeConfiguration(c => c.Properties.Add("hbm2ddl.keywords", "none"))
.BuildSessionFactory();
}
return _sessionFactory;
}
}
public static ISession OpenSession() {
return SessionFactory.OpenSession();
}
}
Все работает нормально, когда я получаю ImageGallery из базы данных, используя этот код:
IImageGalleryRepository igr = new ImageGalleryRepository();
ImageGallery ig = igr.GetById(1);
Но когда я пытаюсь получить доступ к дочернему объекту Image с помощью этого кода
string imageFile = ig.Images[1].File;
Я получаю эту ошибку:
Инициализация [Entities.ImageGallery # 1] - не удалось лениво инициализировать набор ролей: Entities.ImageGallery.Images, ни один сеанс или сеанс не был закрыт
Кто-то знает, как я могу это исправить?
Большое спасибо!
Редактировать
Мой метод GetById:
public ImageGallery GetById(int id) {
using(ISession session = NHibernateSessionFactory.OpenSession()) {
return session.Get<ImageGallery>(id);
}
}