我有一个我想要更新的瞬态对象列表,所有这些都来自同一个表。
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();
}
OR
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()
}
但是,我想了解为什么在多次更新调用之后提交事务而在每次更新后没有刷新时抛出异常。
有人可以解释一下吗?
答案 0 :(得分:0)
从映射生成表时,字符串属性的默认长度为255。为可以容纳长度大于255的字符串的属性指定更大的长度。
答案 1 :(得分:0)
听起来您可能遇到以下问题: https://nhibernate.jira.com/browse/NH-3355
有报道称Sybase,但我无法重现它。阅读有关问题报告的评论。您使用的是什么(文件)版本的ADO.NET提供程序?