我在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个版本?
答案 0 :(得分:1)
nhibernate的一个基本原则是在同一个会话中没有2个相同的对象。就我所知,你所要求的是无法做到的。
您可以在一个会话中查询car
关闭会话。在另一个会话中查询car2
并与两个对象进行比较。使用car2
的属性更新car
。
执行与上述相同的操作,但不要将值从car
复制到car2
。相反,您将打开另一个会话并执行session.Update(car);
您可以创建原始副本或创建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