Следующий метод запрашивает мою базу данных, используя новый сеанс. Если запрос выполняется успешно, он присоединяет (через «Блокировку») результат к «MainSession», который используется для поддержки отложенной загрузки из элемента управления сетки WinForms с привязкой к данным.
Если результат уже в MainSession, я получаю исключение:
NHibernate.NonUniqueObjectException: другой объект с тем же значением идентификатора уже был связан с сеансом: 1, объекта: BI_OverlordDlsAppCore.OfeDlsMeasurement
при попытке повторного подключения, используя метод Lock.
Это происходит, несмотря на то, что я высвобождаю результат из MainSession, прежде чем пытаюсь повторно присоединить его.
Я использовал тот же подход, когда обновляю результат, и он отлично работает.
Может кто-нибудь объяснить, почему это происходит?
Как мне отладить эту проблему?
public static OfeMeasurementBase GetExistingMeasurement(OverlordAppType appType, DateTime startDateTime, short runNumber, short revision)
{
OfeMeasurementBase measurement;
var mainSession = GetMainSession();
using (var session = _sessionFactory.OpenSession())
using (var transaction = session.BeginTransaction())
{
// Get measurement that matches params
measurement =
session.CreateCriteria(typeof(OfeMeasurementBase))
.Add(Expression.Eq("AppType", appType))
.Add(Expression.Eq("StartDateTime", startDateTime))
.Add(Expression.Eq("RunNumber", runNumber))
.Add(Expression.Eq("Revision", revision))
.UniqueResult() as OfeMeasurementBase;
// Need to evict from main session, to prevent potential
// NonUniqueObjectException if it's already in the main session
mainSession.Evict(measurement);
// Can't be attached to two sessions at once
session.Evict(measurement);
// Re-attach to main session
// Still throws NonUniqueObjectException!!!
mainSession.Lock(measurement, LockMode.None);
transaction.Commit();
}
return measurement;
}