2016-07-11 123 views
2

我們正在啓動一個新的應用程序。我們想要使用實體框架。我們有點害怕不小心刪除SQL行(特別是通過設置相關數據等)實體框架:全局禁用刪除

我想禁用每一個刪除,因爲我們只是用「validUntil」列標記每一行,並且從不刪除行。

我看到了that it can done by roles in sql,但我希望所有的邏輯和控制都在代碼中。

也許在實體框架的核心有一個新的功能,以實現這一目標?我知道它仍然可以用EF寫行sql,但我們並不害怕這種情況。

我也嘗試刪除實體關係的setters更放鬆,但它打破了EF的正常功能,並沒有看起來像一個好主意。

我在上面的鏈接中看到了使用存儲庫模式的建議,但是看起來它不是好的做法。

如何安全使用EF? 謝謝!

回答

2

角色選項是一種方式,但您也可以覆蓋SaveChanges

public override int SaveChanges() 
{ 
    foreach (DbEntityEntry entity in this.ChangeTracker.Entries) 
    { 
     if (entity.State == System.Data.EntityState.Deleted) 
      return;   
    } 

    base.SaveChanges(); 
} 

編輯

我讀的git對於EF Core

如果你想改變所有關係刪除行爲,則 您可以在OnModelCreating使用此代碼( ...)批量設置您的模型中所有 關係。

foreach (var relationship in modelBuilder.Model.GetEntityTypes().SelectMany(e => e.GetForeignKeys())) 
{ 
    relationship.DeleteBehavior = DeleteBehavior.Restrict; 
} 
+0

它不工作。我有一對多的訂閱帳戶。 帳戶ID == 13有一個訂閱(ID == 5)。 現在我設置了var x = _context.Accounts.Include(b => b.Subscriptions).First(a => a.AccountId == 13); then x.Subscriptions = null; 現在在覆蓋保存更改沒有狀態==刪除的實體存在,但一旦saveChanges完成訂閱ID == 5從數據庫刪除... – arielorvits

+0

您使用EF 6或EF核心? –

+0

核心。我更改刪除級聯嚴格,所以它解決了這種情況 – arielorvits

1

威廉的回答是相當多的方式做到這一點,但你也可以做這樣的事情。

設置Delete以引發異常,並添加DeleteVirtual方法。主要是這也是更新,您可以通過更新validUntil字段來執行軟刪除。

T IDbContext.Delete<T>(T entity) 
    { 
     throw new NotImplementedException(); 
    } 


    T IDbContext.DeleteVirtual<T>(T entity) 
    { 
     this.Entry(entity).State = EntityState.Modified; 
     return entity; 
    } 
1

可以在DbContext類中重寫SaveChanges()方法,並在那裏你可以得到刪除實體的名單,並改變他們的StatusUnchanged

public override int SaveChanges() 
{ 
    var DeletedEntities = ChangeTracker.Entries().Where(E => E.State == EntityState.Deleted).ToList(); 

    DeletedEntities.ForEach(E => 
    { 
     E.State = EntityState.Unchanged; 
    }); 

    return base.SaveChanges(); 
} 
+0

它不工作。我有一對多的訂閱帳戶。帳戶ID == 13有一個訂閱(ID == 5)。現在我設置了var x = _context.Accounts.Include(b => b。訂閱)。首先(a => a.AccountId == 13);那麼x.Subscriptions = null;現在在重寫保存更改沒有狀態==刪除的實體存在,但一旦saveChanges完成訂閱id == 5從db中刪除... – arielorvits