The easiest way to implement soft delete in EF Core is through query filters.
This filter can be specified when creating our EF Core model:
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
protected override void OnModelCreating(ModelBuilder builder) | |
{ | |
base.OnModelCreating(builder); | |
builder.Entity<Role>().Property<bool>("isDeleted"); | |
builder.Entity<Role>().HasQueryFilter(r => EF.Property<bool>(r, "isDeleted") == false); | |
} |
Now every time when query for the āRoleā object an extra āWHEREā clause is included that filters with IsDeleted=false.
But hold your horses we are not there yet, we also have to override our SaveChanges()and SaveChangesAsyc() methods on the DbContext otherwise the āRoleā entity will still be removed from the database when we call Remove().
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
public override int SaveChanges() | |
{ | |
SoftDelete(); | |
return base.SaveChanges(); | |
} | |
public override Task SaveChangesAsync(bool acceptAllChangesOnSuccess, CancellationToken cancellationToken = default(CancellationToken)) | |
{ | |
SoftDelete(); | |
return base.SaveChangesAsync(acceptAllChangesOnSuccess, cancellationToken); | |
} | |
private void SoftDelete() | |
{ | |
var markedAsDeleted = ChangeTracker.Entries().Where(x => x.State == EntityState.Deleted); | |
foreach (var item in markedAsDeleted) | |
{ | |
//TODO: Create a more generic alternative | |
if (item.Entity is Role role) | |
{ | |
item.State = EntityState.Unchanged; | |
role.IsDeleted = true; | |
} | |
} | |
return base.SaveChanges(); | |
} |
Remark: As a possible improvement you could generate a base class or interface for all āsoft deletableā entities.