NHibernate XML映射抛出Transaction Not Connected异常

时间:2016-03-08 11:17:57

标签: c# sql-server xml nhibernate

我的模型上有一个字符串字段,我将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();
        }
    }

我认为另一个错误/异常是错误的,但&#34;交易没有连接&#34;异常是隐藏细节。没有InnerException。

如果我更改了数据库中的字段类型,并且更改了来自&#39; xml&#39;的映射中的sql-type。对于文本&#39;然后整个过程完美无缺。但是我需要字段为&#39; xml&#39;。

1 个答案:

答案 0 :(得分: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 db类型是xml?据我所知,它主要用于从映射生成数据库模式。你在做吗?如果没有,它是否可以告诉NHibernate关于db xml类型的任何内容,只是让NHibernate将其作为字符串处理,而在DB中将其作为xml处理?