Замок Active Record NHibernate Same Session 2 версии одного и того же объекта - PullRequest
0 голосов
/ 23 февраля 2012

У меня есть машина в базе данных, где поле Model - "Ferrari"

using (new TransactionScope())
{
    var car = Find(1);
    car.Model = "Ferrari Plus";

    // i need the old Car value to make a comparison
    var car2 = Find(1);

    // i need here the db Car record, instead i have the cached Nhibernate value
    if (car2.Model == 'Ferrari") 
        // do something
}

Я изменил код таким образом

using (new TransactionScope())
{
    var car = Find(1);
    car.Model = "Ferrari Plus";

    // i need the old Car value to make a comparison
    using (new TransactionScope())
    {
        var car2 = Find(1);
        // i got  the db value buuuuuuut
        // if i save because i need to save the modific Car i got an error
        if (car2.Model == 'Ferrari") 
            car.Save(); // ERROR: 2 objects with the same id exists
    }

}

как я могу избежать этой проблемы? Как я могу получить 2 версии одного и того же объекта в одном сеансе NHibernate?

Ответы [ 2 ]

1 голос
/ 23 февраля 2012

Один из базовых принципов nhibernate состоит в том, чтобы не иметь 2 одинаковых объектов в одном сеансе.То, что вы просите, не может быть выполнено, насколько я знаю.

Возможное решение 1

Вы можете запросить car в одном сеансе, чтобы закрыть сеанс.Запрос car2 в другом сеансе и сравнение с двумя объектами.Обновите car2 свойствами car.

Возможное решение 2

Сделайте то же, что и выше, за исключением того, что не копируйте значения из car в car2.Вместо этого вы должны открыть другой сеанс и выполнить session.Update(car);

Возможное решение 3

Вы можете создать копию оригинала или создать dto.Когда вы сделаете сравнение, сравните постоянный экземпляр (измененную копию) с копией / dto.

0 голосов
/ 04 апреля 2012

Вы можете Evict () для объекта и сказать ActiveRecord / NHibernate больше не отслеживать этот объект.Но вы должны сделать это, прежде чем начать менять.Ваш код должен выглядеть следующим образом:

// i need the old Car value to make a comparison
var car2 = Find(1);
ActiveRecordMediator.Evict(car2); //Tell AR to no longer track this object

var car = Find(1);  // now returns a new fresh version from the database
car.Model = "Ferrari Plus";

if (car2.Model == 'Ferrari") 
    // do something

Взгляните на эту Диаграмму жизненного цикла активной записи .

...