Я занимаюсь разработкой проекта, в котором есть несколько программ, использующих один и тот же лениво загруженный файл базы данных SQLite, использующий Fluent Nhibernate (Auto Mapping) в качестве слоя доступа к данным.
Первая программа, которую я разработал (назовем ее Программой 1), постоянно поддерживала сессию, и отложенная загрузка работала нормально.
Этот подход не удался, когда я запустил Программу 2 и попытался записать в базу данных из Программы 2 во время работы Программы 1 - я получил исключения «база данных заблокирована».
Я справился с этим, закрыв сессию после запуска программы 1 - например,
private ISessionFactory _sessionFactory;
private ISession _session;
_sessionFactory = Database.CreateSessionFactory();
_session = _sessionFactory.OpenSession();
_session.BeginTransaction();
// ... read the database here
_session.Close();
Конечно, это прервало ленивую загрузку в Программе 1, когда пользователь выбрал другой набор данных из интерфейса пользователя - что я и ожидал.
Я думал, что смогу просто снова открыть сессию, когда пользователь выберет новые данные, а затем снова закрыть ее, например,
if ( !_session.IsOpen )
_session = _sessionFactory.OpenSession();
if ( !_session.IsConnected )
_session.Reconnect();
_session.BeginTransaction();
// ... read the database here
_session.Close();
Но до сих пор не удалось заставить это работать. Я получаю исключение "нет сеанса или сеанс был закрыт", когда я пытаюсь прочитать данные, хотя я только что открыл сеанс. (Тест на соединение был всего лишь экспериментом, потому что трассировка исключений говорила что-то о создании отложенных исключений при отключении, но это не помогало)
Что я делаю не так?