0

我显然在这里做错了什么。我不明白为什么 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."}"

在这种情况下,我应该如何正确退出我的交易?

4

1 回答 1

1

根据这里的文档

如果您碰巧使用的是 ITransaction API,则无需担心这一步 [刷新会话]。它会在事务提交时隐式执行。

因此,如果您使用的是 NHibernate ITransaction.Commit(),则无需刷新。如果事务被回滚,你肯定不想刷新。只要确保你总是关闭会话。

于 2013-02-08T20:36:46.193 回答