5

私は多対多の関係を持っています:多対多の関係で削除するにはどうすればいいですか?

製品には多くのカテゴリがあり、カテゴリには多くの製品があります。

は、私は今、私はShopping Categoryを削除

Shopping Category 
Food Category 

Product A - Shopping Category, Food Category 
Product B - Shopping Category 

を持っていると言います。 Product Aの参照をShopping Categoryから削除して、Product Bを完全に削除したいとします。

私はで終わるだろう:私はNHibernateの中でこれを行うにはどうすればよい(私は流暢NHibernateはを使用しています)

Product A - Food Category. 

私はCascade DeleteOrphanAllDeleteOrphanを使用しようとしましたが、私がそれを行い、ショッピングを削除すると、製品AとBの両方が削除されます。

public class CategoryMapping : ClassMap<Category> 
{ 
    public CategoryMapping() 
    { 
     Id(x => x.Id).GeneratedBy.GuidComb(); 

     Map(x => x.Name).Not.Nullable().NvarcharWithMaxSize(); 
     HasManyToMany(x => x.Products).Cascade.DeleteOrphan(); 
    } 
} 


public class ProductMapping : ClassMap<Product> 
{ 
    public ProductMapping() 
    { 
     Id(x => x.Id).GeneratedBy.GuidComb(); 
     Map(x => x.Name).Not.Nullable().NvarcharWithMaxSize(); 
     HasManyToMany(x => x.Categories); 
    } 
} 

    unitOfWork.BeginTransaction(); 
    Category category =session.Load<Category>(id); 
    session.Delete(category); 
    unitOfWork.Commit(); 

答えて

2

私はこれが既存のデータ構造とのマッピングによって処理できるとは思わない。手動コード(*)を書くか、データ構造を変更する必要があると思います。

(*)それはしかし作品100%がわからない...他の

unitOfWork.BeginTransaction(); 
Category category =session.Load<Category>(id); 
var productsDel = category.Products.Where(p => p.Categories.Count == 1); 
productsDel.ForEach(p => session.Delete(p)); 
session.Delete(category); 
unitOfWork.Commit(); 

私はまた、あなたのクロス参照テーブルのマッピングを追加することを考えています。次に、マッピングを設定してそのクロスリファレンステーブルからレコードだけを削除できるようにする必要があります。参照がない製品があるかどうかを確認し、定期的に削除する必要があります。 (いくつかのストアドプロシージャの実行のような定期的なクリーンアップコード)。私はこのソリューションが悪いことを知っている:)まだトリガーや他のSQL Serverのものがある...とにかく良いソリューションではないが、ソリューション。

0

あなたがセッションを行う必要がありますない場合は、ちょうど2つの使用Cascade.SaveUpdate()

間の関連付けを削除したい場合は、単にコレクションからエンティティを削除し、トランザクションを使用している場合は、トランザクションをコミットします.Flush

+0

わかりません。私はsaveUpdateがそれを再保存すると思っていました。あなたがコレクションからエンティティを削除することによって何を意味するのか分かりません。私はカテゴリーを削除するときに削除する参照を必要とする1000の製品を持つことができたので、このカスケードは私自身がそれを行う必要があります。 – chobo2

+0

私はあなたの質問を誤解しているかもしれませんが、私は間違いなく 'DeleteOrphan'と' AllDeleteOrphan'がなぜこの製品Aを削除するのか分かります。 'SaveUpdate'はアソシエーション(多くのテーブルエントリ...' product_category')だけを削除しますが、 'Product A'は削除しません。これは、このカスケード設定を使用するときに手動で処理する必要があるものです。私はこれを扱うカスケードはないと思う(間違っているかもしれない)。 –

+0

うーん、私はそれを試さなければならないだろうが、私はDeleteOrphanがこのような状況のためだと思った。私はそれがまだ何かと関係しているので、製品Aは孤児ではありません。 – chobo2

関連する問題