2013-09-24 21 views
4

嗯,這裏是我的情況:EF5:如何更改默認刪除功能來實現自己的

我們有我們不希望曾經刪除的數據表。有一個名爲isDeleted的列應該被更新,而不是刪除它。

我想用EF5開發附帶的網絡應用程序,但我在那裏遇到問題。我如何實施這一限制?

我可以使用存儲過程來刪除和選擇,但我希望能夠使用EF中的標準功能,只是改變它們的工作方式。哪種方式不那麼艱難,我有什麼選擇可以實現我想要的,因爲我猜我不是第一個要求這個的人?

+0

我不寒而慄表明這一點,但你考慮觸發器?你可以做'而不是刪除'。 –

+0

是的,但下一個選擇仍然會得到的數據..我想要的是所有選擇的電話忽略這些「刪除」行 – sergio

+0

@Sergio你現在談論兩個不同的東西,軟刪除數據和篩選出的記錄被「刪除」。 – SOfanatic

回答

4

您可以重寫您的DbContext的SaveChanges方法。例如。你想禁止刪除產品。您可以保存實體請將isDeleted標誌設置爲true而非將其刪除:

public override int SaveChanges() 
{ 
    var deletedPersonEntries = ChangeTracker.Entries<Person>() 
            .Where(e => e.State == EntityState.Deleted); 

    foreach (var e in deletedPersonEntries) 
    { 
     e.State = EntityState.Unchanged; 
     e.Entity.IsDeleted = true; 
    } 

    return base.SaveChanges(); 
} 

另一種選擇 - 提高異常,如果有人試圖刪除產品:

if (deltedProductEntries.Any()) 
    throw new Exception("You should not delete products!"); 

你也可以簡單地設置實體狀態不變,但我不認爲它是非常好的解決方案。

+1

對於第三種選擇,我會'e.State = EntityState.Unchanged; e.Entity.IsDeleted = true;'這樣只更新'IsDeleted',而不是其他所有內容。 – hvd

+0

@ hvd同意,很好的建議 –

0
CREATE VIEW Foo 
AS 
SELECT 
    f.Id, 
    f.Bar, 
    f.Baz, 
    f.Qux 
FROM Foo_Table 
Where f.Deleted = 0; 

CREATE TRIGGER Foo_Delete 
ON Foo 
Instead of Delete 
AS 
BEGIN 
    Update 
     Foo_Table f 
    SET 
     f.Deleted = 1 
    WHERE 
     f.Id IN (SELECT Id from Deleted) 
END; 
1

你可以這樣說:

  1. 在OnModelCreating添加請將isDeleted鑑別每一個實體可以是軟刪除
  2. 覆蓋的SaveChanges並找到所有條目被刪除
  3. 運行SQL上這些條目設置鑑請將isDeleted然後設置其狀態爲「分離」
  4. 更改任何唯一索引忽略任何軟刪除的記錄

你可以找到這個答案的工作代碼: How to soft delete using Entity Framework Code First

你也可以使用存儲過程,而不是在步驟2和3中使用的代碼 - 我一直在尋找如何EF6 generates the stored procedures for you。您添加代碼,看起來像這樣:

modelBuilder.Entity<AdministrativeArea>().MapToStoredProcedures();

並導致包括該遷移:

 CreateStoredProcedure(
      "dbo.AdministrativeArea_Delete", 
      p => new 
       { 
        ID = p.Int(), 
       }, 
      body: 
       @"DELETE [dbo].[AdministrativeAreas] 
        WHERE ([ID] = @ID)" 
     ); 

現在是從一個刪除一個改變在遷移的SQL的情況下更新。它不會太艱鉅的文字做/替換,但不會是冷靜,如果我們可以改變用於生成CreateStoredProcedure調用模板?....

相關問題