Nhibernate多对多软删除

时间:2016-06-23 11:16:26

标签: c# nhibernate fluent-nhibernate-mapping soft-delete

我正在寻找一种方法来阻止物品从多个表中删除。我发现一条帖子说明我可以使用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();

1 个答案:

答案 0 :(得分:1)

您无法访问未映射的数据库字段。

使关系成为常规实体并且不删除它,但设置IsDeleted标志。

另请注意,不要在映射文件中过滤,而是在您不想看到已删除项目的地方访问列表。它更透明,因此更顺畅。