NHibernate не генерирует исключения, когда ожидается (вызывая Save для объекта в коллекции)?

#nhibernate

#nhibernate

Вопрос:

Я только начинаю использовать NHibernate, и меня немного беспокоит некоторое поведение, которое, по-видимому, не генерирует исключения при попытке выполнить какое-либо действие, когда вы либо неправильно его закодировали, либо произошла ошибка конфигурации.

Например, у меня есть некоторый код:

         ISessionFactory sessions = SessionManager.SessionFactory;
        ISession session = sessions.OpenSession();
        ITransaction tx1 = null;
        tx1 = session.BeginTransaction();
        IList<BusinessUnit> businessUnits = session.QueryOver<BusinessUnit>().List();
        System.Diagnostics.Debug.WriteLine("Count: "   businessUnits.Count);
        businessUnits[0].Name  = "z";
        session.Save(businessUnits[0]);
        if (tx1 != null) tx1.Commit();
        session.Close();
  

Когда я впервые кодировал это, я не включил использование транзакции:

 tx1 = session.BeginTransaction();  
if (tx1 != null) tx1.Commit();
  

Итак, по-видимому, если транзакция отсутствует, NHibernate не создает ее (по крайней мере, в соответствии с моей конфигурацией) автоматически. Я полагаю, это нормально.

Но что меня беспокоит, так это то, что если требуется транзакция, и вы пытаетесь выполнить Save() без нее, почему она не генерирует исключение?

(До сих пор я сталкивался с другой подобной проблемой, я пытался загрузить коллекцию, но, по-видимому, какая-то ошибка в моей конфигурации помешала успешному load…so код выполняется, но никаких исключений, указывающих на то, что что-то пошло не так).

Возможно, мне не хватает какого-либо параметра конфигурации, где исключения подавляются, или пользователь должен все модульно тестировать, поскольку нельзя предположить, что никакое поведение не будет работать?

Ответ №1:

Для ранее существующего объекта функция Save() не передается автоматически в базу данных, в приведенном выше примере для этого требуется вызвать:

 Session.flush();
  

Если кто-то использует транзакцию, то вызывает .Commit() для транзакции затем вызывает flush().

Итак, причина, по которой исключение не генерируется, заключается в том, что кэширование является поведением по умолчанию по замыслу (и если программист не знает об этом, они будут очень смущены !!!)