2012-01-24 22 views
1

我必須使用entitty框架實現軟刪除。如何使用EntityFramework加載根對象及其基於IsDeleted = true的子實體

  • 我的數據庫表有一列IsDeleted
  • 對應實體也有IsDeleted字段。
  • 當用戶刪除一個子實體時,IsDeleted的設置爲對該子對象爲真,並得到很好的保持。
  • 在加載實體對象圖時,我想確保所有相關實體都以條件IsDeleted = false加載。
  • 它嘗試使用以下鏈接的幫助,但我收到很多錯誤:handling-logical-delete-with-entity-framework-4

這裏是我得到每個實體的錯誤:

錯誤3032:問題在映射片段起始於第38行:條件構件與被映射不是「ISNULL =假」以外的條件。刪除EntityHavingClause.IsDeleted上的條件或從映射中刪除它。

問:任何人都可以告訴我哪裏出錯了,加載所有兒童實體的最簡單方法是什麼?IsDelete = false?

回答

1

您將EntityHavingClause.IsDeleted作爲屬性作爲條件映射。你不能這樣做。

當你按照你鏈接的例子,你不應該需要屬性映射。

編輯:

,因爲你需要兩者的屬性和狀態,可能是最好的方法是計算列添加到只顯示請將isDeleted(如果你可以改變的價值你的數據庫表該架構,即)。然後將該條件映射到計算列。

我認爲這比試圖破解EF來映射同一列兩次(如果可以完成的話)更容易。

+0

謝謝GertArnold !!但我不能完全按照鏈接,因爲我將整個實體對象圖形映射到BLL對象圖形中來回映射。而且我無法傳遞對象conext的引用。它的設計方式是BLL的客戶端可以將對象標記爲IsDeleted = true,將其複製到entti並傳遞給DAL以進行持久化。我面臨加載對象,IsDeleted = false作爲過濾器。還有別的辦法嗎? –

+0

請求。看我的編輯。 –

0

這並不容易。正如@GertArnold所指出的,如果你想在條件中使用它,並且在懶惰和急切加載的情況下不會使用你的條件(如果它沒有被映射的話),你就不能有colum映射。每列只能映射一次,條件映射。

訣竅是,一旦你想軟刪除,你不能指望你的業務邏輯會處理它。它將成爲EF的責任。您將需要映射存儲過程來刪除您的實體的操作,它將設置IsDeleted字段而不是執行實際刪除。可以在不使用存儲過程的情況下直接映射SQL命令,但是在設計器中不支持該命令 - 您必須手動將EDMX文件保存爲XML。

您的模型將不支持實體的實際刪除,並且在使用此模型時您將永遠無法訪問軟刪除的實體。這是如何用實體框架進行軟刪除。如果你需要真正的刪除或訪問軟刪除的實體,你將需要另一個模型(另一個EDMX),其中實體將被再次映射而沒有軟刪除,或者你將不得不使用一些技巧來欺騙第一個EDMX並再次映射實體(數據庫視圖或者可能是表別名)。

相關問題