我正在寻找一种方法来阻止物品从多个表中删除。我发现一条帖子说明我可以使用IPostCollectionRemoveEventListener和/或IPostCollectionRecreateEventListener。问题是它们都没有被触发。
示例:
假设我们有表产品和表顺序。订单可以包含多个产品。产品可以多次出售(因此它以多个订单引用)。这就是多对多Table,ProductOrder到位的地方。所有这些表都有一列IsDeleted甚至多对多。
我的C#项目中没有直接映射多对多表。 我使用HasManyToMany。
产品映射:
HasManyToMany(x => x.Orders)
.ChildKeyColumn("OrderId")
.AsSet()
.ParentKeyColumn("ProductId")
.LazyLoad()
.Table("ProductOrder")
.Not.Inverse()
.Where("IsDeleted != 1");
订单映射:
HasManyToMany(x => x.Products)
.ChildKeyColumn("ProductId")
.AsSet()
.ParentKeyColumn("OrderId")
.LazyLoad()
.Table("ProductOrder")
.Not.Inverse()
.Where("IsDeleted != 1");
这一切都正常,直到我从Products或Orders集合中删除项目。这会导致完全删除,而我更喜欢通过将IsDeleted属性设置为1来使用软删除,但我似乎找不到阻止删除语句的方法......
我如何删除和保存更改的示例代码:
var order = ...;
var product= ...;
product.Orders.Remove(order);
...
SessionHandler.CurrentSession.Update(product);
SessionHandler.CurrentSession.Flush();
答案 0 :(得分:1)
您无法访问未映射的数据库字段。
使关系成为常规实体并且不删除它,但设置IsDeleted标志。
另请注意,不要在映射文件中过滤,而是在您不想看到已删除项目的地方访问列表。它更透明,因此更顺畅。