2016-06-23 131 views
0

我正在尋找一種方法來阻止從多個表中刪除項目。我發現一篇文章說我可以使用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(); 
+0

您不需要在會話上調用更新(因爲實體都已附加,這意味着它們來自查詢而不是來自會話外部)。 –

+0

看看這是否有幫助http://nhibernate.info/blog/2008/09/06/soft-deletes.html –

+0

我試用了DefaultDeleteEventListener,但它只在實體上使用而不在實體集合上時觸發。 – Beejee

回答

0

您無法訪問未映射的DB字段。

使關係成爲一個常規實體,不要刪除它,但設置IsDeleted標誌。

也考慮不要在映射文件中過濾,但是當您在不想看到已刪除項目的地方訪問列表時。它只是更透明,因此工作更順暢。

+0

包括桌子在內,你不覺得有點髒嗎?這意味着我將不得不通過使用HasMany將其添加到映射中... 它還增加了額外的複雜性,尤其是在添加新項目(強制創建新類ProductOrder的實例)時。 – Beejee