2012-01-12 109 views
6

因此,這裏是我的情況:實體框架,軟刪除和查詢

我軟刪除一些表中的行,使用IsDeleted標誌,這樣一個可以讓我的歸檔數據的痕跡。我通過覆蓋我的ObjectContext中的SaveChanges聲明來做到這一點。

現在的問題是:我怎樣才能選擇只有IsDeleted == false的行,而不必在每個查詢中指定&& !IsDeleted

有沒有一種方法可以直接在我的上下文中指定它?

tkx!

+0

EF代碼優先或模型的第一? – StriplingWarrior 2012-01-12 19:43:09

+0

而不是標誌,使用表。對於已刪除的表,PK可以與主表相同,PK將刪除的表的PK作爲FK分配給主表。如果您在刪除記錄中找到記錄,那麼將其刪除,如果沒有激活。然後它只是一個簡單的加入。查詢性能會比使用位標誌更好。 – 2012-01-12 20:28:54

+0

@JonRaynor:數據庫並不是我的專長,但在我看來,檢查一下位標誌比做一個連接要便宜很多,特別是因爲你通常會對知道哪些項目更感興趣。不被*刪除(因此不存在於已刪除的表格中)。如果位標誌損害了查詢性能,我寧願使用索引來創建一個完全獨立的表。 – StriplingWarrior 2012-01-13 16:08:52

回答

7

你可以定義在你的表視圖,查詢該視圖,而不是:

CREATE VIEW dbo.ActiveData 
AS 
    SELECT (list of columns) 
    FROM dbo.YourTable 
    WHERE IsDeleted = 0 

然後在您的EDMX模型,從ActiveData視圖,而不是基礎表中讀取數據。

6

如果右鍵單擊模型查看器中的EntitySet,然後單擊「表格映射」,則會出現一個您可以「添加條件」的區域。這應該做你所問的,儘管按照marc_s的建議你可能會更好地使用View來代替。

+0

條件映射是EF中的正確途徑。使用視圖作爲@marc建議的作品,但它將需要額外的更改。 – 2012-01-13 08:26:21

+0

如何在沒有物理edmx的情況下使用代碼優先進行條件映射? – danludwig 2012-01-13 18:48:38

+0

@olivehour:http://stackoverflow.com/questions/8161689/entity-framework-conditional-mapping-with-code-first – StriplingWarrior 2012-01-13 19:39:11

1

這是一個古老的問題,但對於任何新來的人來說。從EF 6起,你應該使用攔截器來進行這種查詢。它在運行時在SQL查詢中放置查詢,並根據標誌過濾記錄。

請參閱下面的更多信息:

Soft Deleting Entities using Interceptors