Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/201.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Nhibernate 如何在多对多关系中删除?_Nhibernate_Fluent Nhibernate_Many To Many_Cascading Deletes_Nhibernate Cascade - Fatal编程技术网

Nhibernate 如何在多对多关系中删除?

Nhibernate 如何在多对多关系中删除?,nhibernate,fluent-nhibernate,many-to-many,cascading-deletes,nhibernate-cascade,Nhibernate,Fluent Nhibernate,Many To Many,Cascading Deletes,Nhibernate Cascade,我有一种多对多的关系: 产品有很多类别,类别有很多产品 说我有 Shopping Category Food Category Product A - Shopping Category, Food Category Product B - Shopping Category 现在我删除了购物类别。我希望产品A参考从购物类别中删除,我希望产品B完全删除 我最终会: Product A - Food Category. 我如何在nhibernate中做到这一点(我使用的是流利的nhi

我有一种多对多的关系:

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

说我有

Shopping Category  
Food Category

Product A - Shopping Category, Food Category  
Product B - Shopping Category
现在我删除了
购物类别
。我希望
产品A
参考从
购物类别中删除
,我希望
产品B
完全删除

我最终会:

Product A - Food Category.
我如何在nhibernate中做到这一点(我使用的是流利的nhibernate)

我尝试使用Cascade
deleteonforn
alldeleteonforn
,但当我这样做并删除购物时,产品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();
公共类类别映射:类映射
{
公共类别映射()
{
Id(x=>x.Id).GeneratedBy.GuidComb();
Map(x=>x.Name).Not.Nullable().NvarcharWithMaxSize();
HasManyToMany(x=>x.Products).Cascade.DeleteOrphan();
}
}
公共类ProductMapping:ClassMap
{
公共产品映射()
{
Id(x=>x.Id).GeneratedBy.GuidComb();
Map(x=>x.Name).Not.Nullable().NvarcharWithMaxSize();
HasManyToMany(x=>x.Categories);
}
}
unitOfWork.BeginTransaction();
类别=会话加载(id);
删除(类别);
unitOfWork.Commit();

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


然后只需从集合中删除实体,并提交事务(如果您正在使用事务,如果不使用事务,则需要执行会话)。Flush

我认为这不能通过映射现有数据结构来处理。我认为您需要编写一些手动代码(*)或更改数据结构

(*)但不能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();
unitOfWork.BeginTransaction();
类别=会话加载(id);
var productsDel=category.Products.Where(p=>p.Categories.Count==1);
productsDel.ForEach(p=>session.Delete(p));
删除(类别);
unitOfWork.Commit();
其他:


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

我不明白。我认为saveUpdate很可能会重新保存它,但我不确定从集合中删除实体是什么意思。当我删除分类库时,我可能有1000个产品需要删除它们的引用,所以这似乎是我必须自己做的级联。我可能误解了你的问题,但我可以肯定地看到为什么在这种情况下
deleteOrvan
alldeleteOrvan
删除产品a
SaveUpdate
只会删除关联(多对多表条目…
product_category
),但不会删除
product A
。这是使用此级联设置时必须手动处理的问题。我不认为有一个级联可以处理这个问题(虽然可能是错误的)。嗯,我必须尝试一下,但我认为DeleteOrphan正适合这种情况。我不认为产品A对我来说是孤儿,因为它仍然与某些东西有关系。