У меня есть список из 10 объектов данных, которые я хочу вставить / обновить в базе данных с помощью NHibernate. Если одно выдает исключение (скажем, нарушение первичного ключа), я все равно хочу вставить / обновить другое 9. Я свернул каждую объектную операцию в свою собственную атомарную транзакцию и откатил транзакцию, если есть исключение. Проблема заключается в том, что если транзакция действительно вызывает исключение и откатывается, при следующей транзакции Nhibernate выдает сообщение об ошибке: пустой идентификатор в записи Nexus.Data.PortfolioCorporateEntity (не сбрасывать сеанс после возникновения исключения)
Моя основная программа проста. Он создает сеанс из фабрики сеансов, создает уровень доступа к данным, выполняет некоторую работу с объектами данных, а затем пытается сохранить эти объекты данных в базе данных.
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;
}
Это работает нормально, за исключением исключения, оно говорит, что не стирайте сеанс после исключения. Я не уверен, почему - транзакция была отменена, и база данных должна быть готова принять другую транзакцию. Нет? Что я делаю не так?