【问题标题】:NHibernate updating multiple transient objects exception: Error dehydrating property value forNHibernate 更新多个瞬态对象异常:错误脱水属性值
【发布时间】:2013-02-19 06:16:02
【问题描述】:

我有一个我想更新的临时对象列表,所有这些都来自同一个表。

IList<MyObject> objectsToUpdate = GetObjectsToUpdate();
using (var session = GetSession())
using (var transaction = session.BeginTransaction())
{
    foreach (var obj in objectsToUpdate)
    {
        obj.Property = "new value";
        session.Update(obj);
    }
    transaction.Commit(); //exception thrown here
}

异常消息:MyObject.Property 的属性值脱水时出错 内部异常消息:字符串值的长度超过了映射/参数中配置的长度。

异常消息没有真正意义,因为映射中没有长度配置,并且字符串在范围内。

我能够通过以下方式解决问题:

1) 调用 session.Update(obj) 后调用 session.Flush()

IList<MyObject> objectsToUpdate = GetObjectsToUpdate();
using (var session = GetSession())
using (var transaction = session.BeginTransaction())
{
    foreach (var obj in objectsToUpdate)
    {
        obj.Property = "new value";
        session.Update(obj);
        session.Flush();
    }
    transaction.Commit();
}

2) 调用 session.Merge(obj),修改其属性,然后一次性提交。

IList<MyObject> objectsToUpdate = GetObjectsToUpdate();
using (var session = GetSession())
using (var transaction = session.BeginTransaction())
{
    foreach (var obj in objectsToUpdate)
    {
        obj = session.Merge(obj);
        obj.Property = "new value";
    }
    transaction.Commit()
}

但是,我想了解为什么在多次更新调用后提交事务时抛出异常,而不在每次更新后刷新。

谁能解释一下?

【问题讨论】:

  • 什么关系型数据库?哪个 NHibernate 版本?
  • Sybase ASE 15.5 和 NHibernate 3.3.2.4000

标签: nhibernate


【解决方案1】:

从映射生成表时,字符串属性的默认长度为 255。为可以容纳长度大于 255 的字符串的属性指定更大的长度。

【讨论】:

  • 表不是从映射生成的,字符串在定义的范围内。
【解决方案2】:

听起来您可能遇到以下问题: https://nhibernate.jira.com/browse/NH-3355

它是为 Sybase 报告的,但我无法重现它。阅读问题报告中的 cmets。您使用的是他们的 ADO.NET 提供程序的什么(文件)版本?

【讨论】:

  • Sybase.AdoNet2.AseClient.dll 文件版本 1.15.186.0 我来看看那个 JIRA 票证。
  • 听起来比我在测试时使用的旧版本,所以这与我的理论一致,即这是他们提供者早期版本中的一个错误。请查看您是否可以尝试更新版本并在此处或错误报告中发表评论。
猜你喜欢
  • 2019-02-15
  • 2012-06-04
  • 1970-01-01
  • 1970-01-01
  • 2013-11-22
  • 1970-01-01
  • 2011-09-24
  • 2012-06-14
  • 1970-01-01
相关资源
最近更新 更多