我正在尋找一種方法來阻止從多個表中刪除項目。我發現一篇文章說我可以使用IPostCollectionRemoveEventListener和/或IPostCollectionRecreateEventListener。問題是他們都沒有被觸發。Nhibernate多對多軟刪除
例如:
比方說,我們有一個表產品和一個表順序。訂單可以由多個產品組成。一個產品可以多次銷售(所以它在多個訂單中被引用)。這就是許多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");
這一切工作正常,直到我刪除的產品或訂單收集的物品。這導致完全刪除,而我更喜歡使用軟刪除通過將IsDeleted屬性設置爲1,但我似乎無法找到一種方法來防止刪除語句...
如何刪除並保存示例代碼更改:
var order = ...;
var product= ...;
product.Orders.Remove(order);
...
SessionHandler.CurrentSession.Update(product);
SessionHandler.CurrentSession.Flush();
您不需要在會話上調用更新(因爲實體都已附加,這意味着它們來自查詢而不是來自會話外部)。 –
看看這是否有幫助http://nhibernate.info/blog/2008/09/06/soft-deletes.html –
我試用了DefaultDeleteEventListener,但它只在實體上使用而不在實體集合上時觸發。 – Beejee