gpt4 book ai didi

c# - 如何在异常后清除 NHibernate 缓存

转载 作者:行者123 更新时间:2023-11-30 15:30:17 24 4
gpt4 key购买 nike

我想知道如何最好地处理已知处于不良状态的 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&Commit。美好的。但!在 StartCar 中,我们将获取已更改 FrontColor 的缓存 Car 对象。保存的汽车将是前后颜色不同的汽车!

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

最佳答案

创建一个新 session !

来自docs

If the ISession throws an exception you should immediately rollback the transaction, call ISession.Close() and discard the ISession instance.

关于c# - 如何在异常后清除 NHibernate 缓存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22382167/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com