如何在异常后清除NHibernate缓存

时间:2014-03-13 14:44:20

标签: c# caching nhibernate

我想知道如何最好地处理问题"已知NHibernate缓存对象处于错误状态。

做了一个小小的,愚蠢的例子来说明我遇到的问题。

public void RepaintCar(ISession session, int carId, System.Drawing.Color color)
{
    try
    {
         session.BeginTransaction();
         var car = session.Query<Car>().First(x => x.Id == carId);
         car.FrontColor = color;
         throw new Exception("Ran out of Paint. Could not finish job!");
         car.BackColor = color;
         session.SaveOrUpdate(car); 
         session.Transaction.Commit();
    }
    catch (Exception)
    {
         session.Transaction.Rollback();
    }
}  
public void StartCar(ISession session, int carId)
{
    session.BeginTransaction();
    var car = session.Query<Car>().First(x => x.Id == carId);
    car.Start();
    session.SaveOrUpdate(car);
    session.Transaction.Commit();
}
public void TestScenario()
{
    var session = SessionFactory.GetSession();
    try
    {
        RepaintCar(session, 1, System.Drawing.Color.Red);
    }
    catch (Exception ex)
    {
        // lets ignore the exception, we probably just ran out of paint
    }
    StartCar(session, 1);
}

现在,如果我们运行TestScenario,我们显然会得到一个异常,并且不会发生Save&amp; Commit。精细。但!在StartCar中,我们将获得已更改FrontColor的缓存Car对象。保存的汽车将是前后不同颜色的汽车!

避免这种行为的最佳方法是什么?我知道我可以在发生事务回滚时创建session.Clear()。这是避免这种或多或少不可预测的行为的最好方法吗?

1 个答案:

答案 0 :(得分:4)

创建一个新会话!

来自docs

  

如果ISession抛出异常,则应立即回滚   在事务中,调用ISession.Close()并丢弃ISession   实例