如何删除多对多的关系?

cho*_*bo2 5 nhibernate many-to-many fluent-nhibernate nhibernate-cascade cascading-deletes

我有很多关系:

产品有很多类别,类别有很多产品.

说我有

Shopping Category  
Food Category

Product A - Shopping Category, Food Category  
Product B - Shopping Category
Run Code Online (Sandbox Code Playgroud)

现在我删除Shopping Category.我希望Product A删除引用Shopping Category,我想Product B完全删除.

我最终会:

Product A - Food Category.
Run Code Online (Sandbox Code Playgroud)

我如何在nhibernate中执行此操作(我使用流利的nhibernate).

我尝试使用Cascade DeleteOrphan,AllDeleteOrphan但当我这样做并删除购物时,产品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();
Run Code Online (Sandbox Code Playgroud)

And*_*day 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();
Run Code Online (Sandbox Code Playgroud)

其他:

我还在考虑为您的交叉引用表添加映射。然后您应该能够配置映射,以便它只删除该交叉引用表中的记录。您需要验证是否存在没有参考的产品并定期删除它们。(一些定期清理代码,例如运行一些存储过程)。我知道这个解决方案闻起来很糟糕:)仍然有触发器和其他 SQL Server 东西...无论如何都不是好的解决方案,而是解决方案。