私は、アイテムが多対多テーブルから削除されないようにする方法を模索しています。私はIPostCollectionRemoveEventListenerやIPostCollectionRecreateEventListenerのいずれかを利用することができると述べた記事を見つけました。問題はどちらも起動されていないことです。Nhibernate多対多ソフト削除
例:
テーブル製品とテーブルオーダーがあるとします。注文は複数の商品で構成することができます。製品は複数回販売することができます(複数の注文で参照されています)。そこに、多対多テーブルのProductOrderが配置されています。これらのテーブルには、多くの場合でも多くの場合でもIsDeletedという列があります。
多対多テーブルは、C#プロジェクトに直接マップされていません。 私はHasManyToManyを利用します。製品の
マッピング:注文の
HasManyToMany(x => x.Orders)
.ChildKeyColumn("OrderId")
.AsSet()
.ParentKeyColumn("ProductId")
.LazyLoad()
.Table("ProductOrder")
.Not.Inverse()
.Where("IsDeleted != 1");
マッピング:私は商品や受注コレクションから項目を削除するまで
HasManyToMany(x => x.Products)
.ChildKeyColumn("ProductId")
.AsSet()
.ParentKeyColumn("OrderId")
.LazyLoad()
.Table("ProductOrder")
.Not.Inverse()
.Where("IsDeleted != 1");
このすべては、正常に動作します。これにより、完全削除が発生しますが、ソフト削除はIsDeletedプロパティを1に設定することで行いますが、削除ステートメントを防ぐ方法が見つからないようです...
削除と保存のサンプルコード変更:
var order = ...;
var product= ...;
product.Orders.Remove(order);
...
SessionHandler.CurrentSession.Update(product);
SessionHandler.CurrentSession.Flush();
セッションで更新を呼び出す必要はありません(エンティティがすべて添付されている、つまりセッション外からではなくクエリからのものであることを前提として)。 –
これが役立つかどうかを確認http://nhibernate.info/blog/2008/09/06/soft-deletes.html –
私はDefaultDeleteEventListenerを試しましたが、エンティティで使用され、エンティティのコレクションではなく使用された場合にのみトリガされます。 – Beejee