ASP.NET Identity软删除实现:新手如何将IsDeleted值存入数据库?
在ASP.NET Identity中实现软删除并存储IsDeleted字段到数据库
嘿,作为刚接触ASP.NET Identity的新手,你问的这个软删除问题其实挺典型的,我来一步步给你拆解,跟着做就能轻松把IsDeleted字段存到数据库里~
1. 扩展Identity用户模型
默认的IdentityUser类里没有IsDeleted字段,所以我们需要自定义一个用户类来扩展它:
public class ApplicationUser : IdentityUser { // 默认设置为false,表示未删除 public bool IsDeleted { get; set; } = false; // 要是需要记录删除时间,还可以加这个字段 // public DateTime? DeletedAt { get; set; } }
2. 更新你的DbContext
接下来要让你的数据库上下文使用这个自定义的用户类,并且配置IsDeleted字段的映射规则:
public class ApplicationDbContext : IdentityDbContext<ApplicationUser> { public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options) : base(options) { } protected override void OnModelCreating(ModelBuilder builder) { // 一定要先调用base的OnModelCreating,不然Identity的默认配置会失效 base.OnModelCreating(builder); // 配置IsDeleted字段在数据库中的默认值为false builder.Entity<ApplicationUser>() .Property(u => u.IsDeleted) .HasDefaultValue(false); } }
3. 生成迁移并更新数据库
现在需要把这个字段同步到数据库里,打开终端或者Package Manager Console,运行以下命令:
# 生成迁移文件,名字可以随便取,只要能看懂就行 Add-Migration AddIsDeletedColumnToAspNetUsers # 把迁移应用到数据库 Update-Database
执行完之后,你去看数据库里的AspNetUsers表,就会多出一个IsDeleted字段啦~
4. 实现软删除逻辑
注意!别用Identity默认的_userManager.DeleteAsync(user),那是硬删除(直接把记录从数据库删掉)。我们要自己写软删除的方法:
// 注入UserManager<ApplicationUser>到你的服务/控制器里 private readonly UserManager<ApplicationUser> _userManager; public YourService(UserManager<ApplicationUser> userManager) { _userManager = userManager; } public async Task<IdentityResult> SoftDeleteUserAsync(ApplicationUser user) { if (user == null) throw new ArgumentNullException(nameof(user)); // 把IsDeleted设为true user.IsDeleted = true; // 如果加了DeletedAt字段,这里也可以赋值 // user.DeletedAt = DateTime.UtcNow; // 调用UpdateAsync来保存修改 return await _userManager.UpdateAsync(user); }
以后删除用户的时候,调用这个SoftDeleteUserAsync方法就可以了,数据库里的用户记录会保留,只是IsDeleted变成true。
5. 全局过滤已删除用户(推荐)
为了避免查询时不小心查到已删除的用户,我们可以给ApplicationUser加一个全局查询筛选器,这样每次查询都会自动排除已删除的用户:
protected override void OnModelCreating(ModelBuilder builder) { base.OnModelCreating(builder); builder.Entity<ApplicationUser>() .Property(u => u.IsDeleted) .HasDefaultValue(false); // 添加全局筛选器,默认只查询未删除的用户 builder.Entity<ApplicationUser>() .HasQueryFilter(u => !u.IsDeleted); }
如果偶尔需要查询已删除的用户,可以用IgnoreQueryFilters()来绕过这个筛选:
var deletedUsers = await _context.Users.IgnoreQueryFilters() .Where(u => u.IsDeleted) .ToListAsync();
要是你还需要给角色(IdentityRole)或者其他Identity实体做软删除,方法也是一样的:扩展对应类、加字段、配置DbContext、生成迁移就行~
内容的提问来源于stack exchange,提问作者Ahmed
相关产品推荐
相关产品推荐

