2014-09-23 82 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(); 
    }