Castle Active Record NHibernate相同会话2版本的相同对象

Castle Active Record NHibernate相同会话2版本的相同对象,nhibernate,castle-activerecord,transactionscope,Nhibernate,Castle Activerecord,Transactionscope,我在DB有一辆车,模型场是“法拉利” 我用这种方式修改了代码 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);

我在DB有一辆车,模型场是“法拉利”

我用这种方式修改了代码

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
    }

}
我怎样才能避免这个问题?
如何将同一对象的两个版本放入同一个NHibernate会话中?

NHibernate的基本原则之一是在同一会话中不要有两个相同的对象。据我所知,你所要求的是做不到的

可能的解决办法1 您可以在一个会话中查询
car
,然后关闭会话。在另一个会话中查询
car2
,并对两个对象进行比较。使用
car
的属性更新
car2

可能的解决办法2 执行与上述相同的操作,只是不要将值从
car
复制到
car2
。相反,您将打开另一个会话并执行
session.Update(car)

可能的解决办法3 您可以做的是创建原始文件的副本或创建dto。进行比较时,请将持久实例(更改的副本)与副本/dto进行比较。

您可以逐出()一个对象,并告诉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
看看这个

// 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