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)
我认为这不能通过映射现有的数据结构来处理。我认为您需要编写一些手动代码(*)或更改数据结构。
(*) 虽然不能 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 东西...无论如何都不是好的解决方案,而是解决方案。
| 归档时间: |
|
| 查看次数: |
2201 次 |
| 最近记录: |