#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().
Итак, причина, по которой исключение не генерируется, заключается в том, что кэширование является поведением по умолчанию по замыслу (и если программист не знает об этом, они будут очень смущены !!!)