Castle Active Record NHibernate同一对象的Same Session 2版本

时间:2012-02-23 17:10:20

标签: nhibernate castle-activerecord transactionscope

我在DB中有一辆Car,其中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
    }

}

我该如何避免这个问题? 如何在相同的NHibernate会话中获得同一对象的2个版本?

2 个答案:

答案 0 :(得分:1)

nhibernate的一个基本原则是在同一个会话中没有2个相同的对象。就我所知,你所要求的是无法做到的。

可能的解决方案1 ​​

您可以在一个会话中查询car关闭会话。在另一个会话中查询car2并与两个对象进行比较。使用car2的属性更新car

可能的解决方案2

执行与上述相同的操作,但不要将值从car复制到car2。相反,您将打开另一个会话并执行session.Update(car);

可能的解决方案3

您可以创建原始副本或创建dto。进行比较时,将持久性实例(已更改的副本)与副本/ dto进行比较。

答案 1 :(得分:0)

你可以Evict()一个对象并告诉ActiveRecord / NHibernate不再跟踪这个Object。但是在开始更改它之前,您需要执行此操作。所以你的代码应该是这样的:

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

看看这个Active Record Lifecycle Diagram