【问题标题】:NHibernate XML mapping throws Transaction Not Connected exceptionNHibernate XML 映射抛出 Transaction Not Connected 异常
【发布时间】:2016-03-08 11:17:57
【问题描述】:

我的模型上有一个字符串字段,我将 Xml 序列化为:

public virtual string XmlData { get; set; }

我的 SQL Server 表中有一个“xml”类型的对应列,我将其映射到我的 hbm.xml 文件中,如下所示:

<property name="XmlData" type="StringClob">
  <column name="XmlData" sql-type="xml" />
</property>

当我尝试保存我的模型时,我得到一个 NHibernate.TransactionException:

{"Transaction not connected, or was disconnected"}

我用来保存的代码:

    public void Save(T entity)
    {
        WithinTransaction(s => s.SaveOrUpdate(entity));
    }

    protected void WithinTransaction(Action<ISession> action)
    {
        var transaction = Session.BeginTransaction();
        try
        {
            action(Session);
            transaction.Commit();
        }
        catch (Exception)
        {
            transaction.Rollback();
            throw;
        }
        finally
        {
            transaction.Dispose();
        }
    }

我假设另一个错误/异常有问题,但“事务未连接”异常隐藏了详细信息。没有 InnerException。

如果我将数据库中的字段类型和映射中的 sql 类型从“xml”更改为“文本”,那么整个事情就完美了。但是我需要该字段的类型为“xml”。

【问题讨论】:

    标签: c# sql-server xml nhibernate


    【解决方案1】:

    您应该包含有关异常的更多详细信息,例如堆栈跟踪,以便更好地进行诊断。

    可能Rollback 失败,隐藏了原始异常。重写你的捕获。至少检查一下交易是否还在进行中:

    catch
    {
        if (transaction.IsActive)
            transaction.Rollback();
        throw;
    }
    

    或者为了支持最坏的情况,防止任何新的异常:

    catch
    {
        try
        {
            if (transaction.IsActive)
                transaction.Rollback();
        }
        catch (Exception rollbackEx)
        {
            // Avoid hiding original exception, swallow rollback failures.
            // Better add some log though. (log4net example below, supposing
            // you have a ILog _logger property)
            _logger.Error(
                 "Transaction rollback failure after a first exception, " +
                     "swallowing rollback failure",
                 rollbackEx);
        }
        throw;
    }
    

    现在,为什么你需要告诉 NHibernate 数据库类型是xml?据我所知,它主要用于从映射生成数据库模式。你这样做吗?如果没有,它是否可以不告诉 NHibernate 关于 xml 在 db 中键入的任何内容,而只是让它由 NHibernate 作为字符串处理,同时在 DB 中将其作为 xml 处理?

    【讨论】:

    • 完美!这是回滚抛出异常并隐藏原始异常。然后我能够确定实际原因归结为 xml 声明中的编码不匹配,我现在已经解决了这个问题。谢谢。
    猜你喜欢
    • 2012-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多