0

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

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()
}

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

有人可以解释一下吗?

4

2 回答 2

0

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

于 2013-02-19T07:00:43.507 回答
0

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

它是为 Sybase 报告的,但我无法重现它。阅读关于问题报告的评论。您使用的是他们的 ADO.NET 提供程序的哪个(文件)版本?

于 2013-02-19T15:12:42.960 回答