2016-06-23 10 views
0

私は、アイテムが多対多テーブルから削除されないようにする方法を模索しています。私は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(); 
+0

セッションで更新を呼び出す必要はありません(エンティティがすべて添付されている、つまりセッション外からではなくクエリからのものであることを前提として)。 –

+0

これが役立つかどうかを確認http://nhibernate.info/blog/2008/09/06/soft-deletes.html –

+0

私はDefaultDeleteEventListenerを試しましたが、エンティティで使用され、エンティティのコレクションではなく使用された場合にのみトリガされます。 – Beejee

答えて

0

マップされていないDBフィールドにはアクセスできません。

リレーションを通常のエンティティにし、削除しないでIsDeletedフラグを設定します。

また、マッピングファイルでフィルタするのではなく、削除したアイテムを表示したくない場所でリストにアクセスすることも検討してください。それはちょうど透明性があり、したがってよりスムーズに動作します。

+0

あなたはテーブルを含めるのが一種汚いとは思わない?これは、HasManyを使用してマッピングに追加する必要があることを意味します。 新しい項目を追加するときに特に複雑になります(新しいクラスProductOrderのインスタンスを作成する必要があります)。 – Beejee

関連する問題