5

我有一个多对多的关系:

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

说我有

Shopping Category  
Food Category

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

现在我删除Shopping Category. 我希望Product A删除引用,Shopping Category并且希望Product 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

如果您只想删除两者之间的关联使用Cascade.SaveUpdate()

然后只需从集合中删除实体并提交事务,如果您正在使用事务,则需要执行 Session.Flush

于 2012-03-15T19:55:45.317 回答