更新したい一時オブジェクトのリストをすべて同じテーブルから持っています。
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()
}
ただし、各更新後にフラッシュせずに複数の更新呼び出しの後にトランザクションをコミットすると、例外がスローされた理由を理解したいと思います。
誰か説明してくれませんか?