我的模型上有一个字符串字段,我将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;。
答案 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
处理?