5

私は多対多の関係を持っています:

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

私が持っていると言う

Shopping Category  
Food Category

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

今私は削除しShopping Categoryます。Product A参照を削除してShopping CategoryProduct B完全に削除したい。

私は次のようになります:

Product A - Food Category.

nhibernate でこれを行うにはどうすればよいですか (流暢な nhibernate を使用しています)。

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();
4

2 に答える 2

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のものがあります...とにかく良いソリューションではありませんが、ソリューションです。

于 2012-03-25T21:15:06.413 に答える
0

2つの使用の間の関連付けを削除したいだけの場合Cascade.SaveUpdate()

次に、コレクションからエンティティを削除し、トランザクションを使用している場合はトランザクションをコミットします。そうでない場合は、Session.Flush を実行する必要があります。

于 2012-03-15T19:55:45.317 に答える