Я создаю большое количество сущностей с помощью NHibernate, присоединяю их к моему ISession, а затем использую транзакцию для фиксации моих изменений в базе данных. Пример кода ниже:
ISession _context = SessionProvider.OpenSession();
//Create new entities
for(int i=0; i<100; i++)
{
MyEntity entity = new MyEntity(i);
//Attach new entity to the context
_context.Save(entity);
}
//Persist all changes to the database
using(var tx = _context.BeginTransaction())
{
//Flush the session
tx.Commit();
}
У меня создалось впечатление, что строка _context.Save () просто информирует ISession о новом объекте, но никакие изменения в базе данных не сохраняются, пока я не очищу сеанс через строку tx.Commit ().
Однако я заметил, что база данных получает новую сущность каждый раз, когда я вызываю _context.Save (). В результате я получаю слишком много индивидуальных обращений к базе данных.
Кто-нибудь знает, почему ISession.Save () автоматически сохраняет изменения? Я что-то неправильно понял о том, как ведет себя NHibernate? Спасибо.
*** РЕДАКТИРОВАТЬ - Просто чтобы прояснить (в свете двух предложенных ответов) - моя проблема в том, что база данных обновляется, как только я вызываю _context.Save (). Я не жду этого. Я ожидаю, что в базу данных ничего не будет вставлено, пока я не вызову tx.Commit (). К сожалению, ни один из двух предложенных ответов пока не помогает.
Некоторую полезную информацию о генераторах идентичности можно найти здесь
Save
выполняется за пределамиTransaction
. Правильный ответ должен быть @StuffHappens внизу. - person THBBFT   schedule 12.06.2016Save
. Этот ответ просто гарантирует, что вставки будут откатаны, но это не было проблемой OP. И его редакция еще раз подтверждает это. - person Frédéric   schedule 18.06.2017