2014-09-23 101 views
2

我想阻止任何刪除我的數據庫表上。目前使用實體框架5.首先這裏是我的代碼,實體框架5軟刪除

public override int SaveChanges() 
    { 
     var Changed = ChangeTracker.Entries(); 
     if (Changed != null) 
     { 
      foreach (var entry in Changed.Where(e => e.State == EntityState.Deleted)) 
      { 
       entry.State = EntityState.Unchanged; 
      } 
     } 

     return base.SaveChanges(); 
    } 

我設法防止這種方式。當我使用刪除EF的方法它不工作了。但是,我想實現的是,當我使用給定ID的刪除方法,我想設置isDeleted(這是一個(位)列在我所有的數據庫表)值設置爲false。目前,我迷失在互聯網上的文件和共享代碼中。

感謝

回答

6

我可能會通過使是軟刪除的實現一個接口,像ISoftDeletable實體處理這個問題。

public interface ISoftDeletable 
{ 
    bool IsDeleted { get; set; } 
} 

然後擴展上面的代碼檢查,如果實體類型實現了ISoftDeletable接口,如果它只是設置請將isDeleted爲true。

public override int SaveChanges() 
    { 
     var Changed = ChangeTracker.Entries(); 
     if (Changed != null) 
     { 
      foreach (var entry in Changed.Where(e => e.State == EntityState.Deleted)) 
      { 
       entry.State = EntityState.Unchanged; 
       if (entry.Entity is ISoftDeletable) 
       { 
        // Set IsDeleted.... 
       } 
      } 
     } 

     return base.SaveChanges(); 
    } 

然後,您需要確保查詢實現ISoftDeletable的實體過濾那些軟刪除的實體。

+0

太感謝你了。這現在很有意義。我終於做到了! 編輯:*咳嗽*你做到了。 – 2014-09-23 12:05:19

+0

@ArefiClayton我正在尋找一些類似的東西,但用這種方法我persume isDeleted需要在所有表上? – rogue39nin 2015-12-02 01:20:07

+0

只有需要刪除記錄的表(pocos)才能實現IDeletable ...那些不會被刪除的記錄。 – BenjaminPaul 2015-12-03 05:23:20

0

建立在@BenjaminPauls偉大的答案,但使用通用Entries<TEntity>。在我看來,它會清理代碼和雛鳥。

public override int SaveChanges() 
{ 
    foreach (var entry in ChangeTracker.Entries<ISoftDeletable>()) 
    { 
     if (entry.State == EntityState.Deleted) 
     { 
      // Set deleted. 
     } 
    } 
    return base.SaveChanges(); 
} 

甚至:

public override int SaveChanges() 
    { 
     foreach (var entry in ChangeTracker.Entries<ISoftDeletable>() 
      .Where(x => x.State == EntityState.Deleted) 
     { 
      // Set deleted. 
     } 
     return base.SaveChanges(); 
    }