2

実稼働システムで断続的な問題が発生し、ローカルで再現できませんでした。発生しているように見えるのは、子エンティティの編集中に明白な理由がなく、コレクションを含む親を保存すると、子エンティティの親の関連付けがデータベースから削除されることです。子エンティティを効果的に孤立させます。

流暢なマッピングは次のとおりです。

 mapping.HasMany<ExpenseItem>(x => x.ExpenseItems).Cascade.AllDeleteOrphan();

エンティティは直接保存することもできます (集約ルートでもあります) が、テスト中、親の関連付けが削除されることは示されませんでした。

子オブジェクトには親自体への参照はなく、関連付けはすべて Nhibernate が処理する DB にあります。

また、経費項目 (子エンティティ) をその親の外に直接追加することはできないため、同じ子エンティティを別の親に割り当てることはできません。以下のコードを参照してください。

 public virtual ExpenseItem AddNewExpenseItem(ExpenseAnalysis analysis,
            string recipientName,
            string purchaseAccountReference,
            string expenseDescription,
            string expenseNotes,
            Money value,
            VATAnalysis vat)
        {
            Validate.IsNotNull<ExpenseAnalysis>(analysis);
            Validate.IsNotNull(expenseDescription);
....


            ExpenseItem newExpenseItem = new ExpenseItem(analysis,
                recipientName,
                purchaseAccountReference,
                expenseDescription,
                expenseNotes,
                value,
                vat,
                expenseItemUniqueReference,
                true,
                Candidate.Assessment);
            _expenseItems.Add(newExpenseItem);
....

何か案は?

4

2 に答える 2

1

マッピングを確認することは間違いなく役立ちますが、見てください

また、その親への参照を使用してExpenseItemをマップします

NHibernateで子オブジェクトを削除するにはどうすればよいですか?

基本的に、NHibernateが削除されたレコードをnullの犠牲者で更新しようとしないように、関係に逆を設定する必要があります。そして、Cascade.Allを設定します。Cascade.DeleteOrphansを使用すると、被害者を無効にすることで関係を壊すだけでなく、子レコード全体を削除できます。

于 2012-09-06T13:47:04.063 に答える
0

この問題は、NHibernate のバグが原因でした。セッションを決してフラッシュしないように設定しましたが、セッションで isdirty を呼び出すと、セッションが最初にフラッシュされていました。ユーザーは経費項目を削除してから編集をキャンセルしていましたが、isdirty チェック中に削除がフラッシュされていました。このタイプのダイアログのセッションの管理方法を変更することで、これを回避できました。

于 2012-09-13T09:53:22.947 に答える