У меня есть список из 10 объектов данных, которые я хочу вставить/обновить в базу данных с помощью NHibernate. Если кто-то генерирует исключение (например, нарушение первичного ключа), я хочу по-прежнему вставлять/обновлять остальные 9. Я перевернул каждую операцию объекта в свою собственную атомную транзакцию и откатил транзакцию, если есть исключение. Проблема заключается в том, что если транзакция вызывает исключение и откатывается назад, на следующей транзакции Nhibernate жалуется на ошибку: null id в записи Nexus.Data.PortfolioCorporateEntity (не сбрасывать сеанс после возникновения исключения)
Моя основная программа проста. Он создает сеанс из sessionfactory, создает уровень доступа к данным, выполняет некоторую работу над объектами данных и затем пытается сохранить эти объекты данных в базе данных.
sessionsManager = new NHibernateSessionManager();
session = sessionsManager.GetSession();
DALC = new NHibernateDataProvider(session);
…
foreach (var pce in pces)
{
try
{
DALC.UpdateOrAddObject<PortfolioCorporateEntity>(pce);
}
catch (Exception ex)
{
Console.WriteLine("Could not add Corporate Entity ID " + pce.CorporateEntity.CorporateEntityID.ToString());
}
}
Это процедура updateOrAdd на моем уровне доступа к данным Nhibernate, называемая 10 раз для 10 объектов.
public void UpdateOrAddObject<T>(T workObject)
{
using (ITransaction tx = mSession.BeginTransaction) {
try {
mSession.SaveOrUpdate(workObject);
mSession.Flush();
tx.Commit();
}
catch (Exception ex) {
tx.Rollback();
throw;
}
}
}
Просто, чтобы четко указать, сеанс создается вызывающей программой и передается объекту уровня доступа к данным, конструктор которого ниже.
public NHibernateDataProvider(ISession session)
{
mSession = session;
}
Это отлично работает, за исключением исключения, он говорит, что не очищает сеанс после исключения. Я не уверен, почему - транзакция была отменена красиво, и база данных должна быть готова принять другую транзакцию нет? Что я делаю неправильно?