0

AsBag、Inverse、Cascade.AllDeleteOrphan としてマップされた子コレクションを持つ NHibernate オブジェクトがあります。

削除されたオブジェクトを再永続化する必要があるシナリオがあります。

親オブジェクトを削除しても問題ありません。親と子はデータベースから削除されます。

問題は、削除されたオブジェクトを再保存/永続化する必要があることです。SaveUpdate を呼び出そうとすると、StaleObjectStateException が発生します。これは、親オブジェクトと子オブジェクトの Id フィールドがまだゼロ以外の値に設定されているためです。

確かに、削除時に親の Id を強制的にゼロにすることはできますが、子の Id を強制的にゼロにするのは面倒です。

これを処理するためのより良い戦略はありますか?

どうもありがとう

4

1 に答える 1

0

あなたのEvictDelete、しかしあなたの前ならFlush、あなたは大丈夫でしょう。保留中の削除がロールオフされます。

        // Act
        using (ISession session = _factory.OpenSession())
        using (ITransaction tx = session.BeginTransaction())
        {
            session.Save(expected);
            session.Flush();

            session.Delete(expected);
            session.Evict(expected);

            tx.Commit();
        }

        using (ISession session = _factory.OpenSession())
        using (ITransaction tx = session.BeginTransaction())
        {
            actual = session.Get<Person>(expected.Id);

            var count = actual.Roles.Count;
        }

        // Assert
        expected.ShouldHave().AllProperties().EqualTo(actual); // succeeds; record is not deleted or otherwise molested.

ただし、一度フラッシュすると、元に戻す/再保存する良い方法はありません。そもそもオブジェクトの削除を回避する方法、削除と復元の間のフラッシュを回避する方法、またはトランザクションをロールバックして削除を元に戻す方法を理解してください。別のオプションとして、データを新しいレコードとして再保存しても問題がない場合(値が保持されている限り)、削除されたレコードのクローンを作成して保存します。

于 2012-06-13T10:02:29.637 に答える