Почему я получаю это исключение nUibernate NonUniqueObjectException? - PullRequest
1 голос
/ 01 октября 2011

Следующий метод запрашивает мою базу данных, используя новый сеанс. Если запрос выполняется успешно, он присоединяет (через «Блокировку») результат к «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;
    }

1 Ответ

2 голосов
/ 04 октября 2011

Я решил проблему после нахождения этого поста в Айенде на Операции с перекрестными сеансами .

Решением было использование ISession.Merge для обновления отсоединенного измеренияосновной сеанс:

    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;

            transaction.Commit();

            if (measurement == null) return null;

            // Merge back into main session, in case it has changed since main session was
            // originally loaded
            var mergedMeasurement = (OfeMeasurementBase)mainSession.Merge(measurement);
            return mergedMeasurement;
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...