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 に答える