我显然在这里做错了什么。我不明白为什么 NHibernate 试图在这种情况下提交任何东西。
我提供了一个长度超过 200 个字符的“描述”字段。我有一个名为:
Order.ValidateAndThrow(Order);
RuleFor(order => order.Description).Length(0, 200).WithName("Description");
因为我的描述长度超过 200 个字符——ValidateAndThrow 会抛出异常。
这是处理异常的 catch 块:
catch (Exception exception)
{
Logger.Error(exception);
NHibernateSessionManager.Instance.RollbackTransaction();
throw;
}
public void RollbackTransaction()
{
ITransaction transaction = ContextTransaction;
try
{
if (HasOpenTransaction())
{
transaction.Rollback();
}
ContextTransaction = null;
}
finally
{
CloseSession();
}
}
/// <summary>
/// Flushes anything left in the session and closes the connection.
/// </summary>
public void CloseSession()
{
ISession session = ContextSession;
if (session != null && session.IsOpen)
{
session.Flush();
session.Close();
}
ContextSession = null;
}
所以,我看到发生的是 transaction.Rollback() 语句成功执行,然后调用 CloseSession()。
在 CloseSession() 内部,执行 session.Flush()。显然,这会导致我的 Order 实体尝试保存到数据库中。不过,我以为我刚刚回滚了我的更改?
然而,调用 SessionClose() 会生成 GenericADOException。内部异常消息读取"{"String or binary data would be truncated.\r\nThe statement has been terminated."}"
在这种情况下,我应该如何正确退出我的交易?