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