我有一个我想更新的瞬态对象列表,所有这些都来自同一个表。
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()
}
但是,我想了解为什么在多次更新调用后提交事务时抛出异常,而不在每次更新后刷新。
有人可以解释一下吗?