通过添加IsDeleted字段并结合EF Core实现软删除,首先在实体中增加bool类型IsDeleted属性,默认为false;然后在OnModelCreating中使用HasQueryFilter过滤已删除数据;接着重写SaveChanges方法,将Delete转为更新IsDeleted为true;可选扩展DeletedAt和DeletedBy记录删除信息;特殊场景下可用IgnoreQueryFilters查询已删除数据。

在C#中实现数据库的软删除模式,核心是标记数据为“已删除”而不是真正从数据库中移除。通常通过添加一个 IsDeleted 字段来实现,并结合 Entity Framework Core(EF Core)进行查询过滤和操作控制。
在实体类中增加一个布尔类型的 IsDeleted 属性,用于标识该记录是否已被软删除。
public class Product
{
public int Id { get; set; }
public string Name { get; set; }
public bool IsDeleted { get; set; } = false;
}
使用 EF Core 的 HasQueryFilter 方法,在 OnModelCreating 中配置,使所有查询自动排除已删除的数据。
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Product>()
.HasQueryFilter(p => !p.IsDeleted);
}
这样每次查询 Product 时,EF Core 会自动加上 WHERE IsDeleted = 0 条件。
拦截 SaveChanges 方法,将删除操作转换为更新 IsDeleted 字段。
public override int SaveChanges()
{
foreach (var entry in ChangeTracker.Entries<Product>())
{
if (entry.State == EntityState.Deleted)
{
entry.Property("IsDeleted").CurrentValue = true;
entry.State = EntityState.Modified;
}
}
return base.SaveChanges();
}
这段代码检查所有被标记为删除的实体,改为设置 IsDeleted = true 并改为修改状态,避免物理删除。
如果需要审计信息,可以扩展字段:
public class Product
{
public int Id { get; set; }
public string Name { get; set; }
public bool IsDeleted { get; set; } = false;
public DateTime? DeletedAt { get; set; }
public string DeletedBy { get; set; }
}
在 SaveChanges 中补充赋值:
if (entry.State == EntityState.Deleted)
{
entry.Property("IsDeleted").CurrentValue = true;
entry.Property("DeletedAt").CurrentValue = DateTime.UtcNow;
// 可根据上下文设置 DeletedBy,如从用户服务获取
entry.State = EntityState.Modified;
}
某些管理功能可能需要查看已删除数据,可通过 IgnoreQueryFilters() 绕过过滤:
var deletedProducts = context.Products
.IgnoreQueryFilters()
.Where(p => p.IsDeleted)
.ToList();
以上就是如何用C#实现数据库的软删除模式?如何配置?的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号