我对 ASP.NET Core 很陌生。我想使用 Entity Framework Core 和 ASP.NET Identity 创建 ASP.NET Core 2.2 WebAPI。另外,我想使用 JWT 来通过令牌保护对该 WebAPI 的访问。
我已成功将用户插入数据库并从 API 取回令牌,并且令牌身份验证正在运行。
但是,我还想软删除数据库记录并跟踪谁删除/更新/添加了记录。其测试表是“国家”,其中字段只有Title和Description。
到目前为止,我已经把互联网颠倒了,但没有帮助:(
我尝试过的最后一件事是(userId 是null):
在startup.cs中:
services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
在我的 AppDbContext.cs 中
public class AppDbContext : IdentityDbContext<AppUser>{
public AppDbContext(DbContextOptions options) : base(options)
{
}
public DbSet<AppUser> AppUsers { get; set; }
public DbSet<Country> Countries { get; set; } // just for testing
protected override void OnModelCreating(ModelBuilder builder)
{
base.OnModelCreating(builder);
// TODO - IGNORE THIS
//builder.Entity<AppUser>().Property<bool>("IsDeleted");
//builder.Entity<AppUser>().HasQueryFilter(m => EF.Property<bool>(m, "IsDeleted") == false);
}
public override async Task<int> SaveChangesAsync(CancellationToken cancellationToken = default(CancellationToken))
{
CheckBeforeSaving();
return (await base.SaveChangesAsync(true, cancellationToken).ConfigureAwait(false));
}
private void CheckBeforeSaving()
{
var httpContextAccessor = this.GetService<IHttpContextAccessor>();
var userId = httpContextAccessor?.HttpContext.User.FindFirstValue(ClaimTypes.NameIdentifier);
foreach (var entry in ChangeTracker.Entries())
{
switch (entry.State)
{
case EntityState.Detached:
break;
case EntityState.Unchanged:
break;
case EntityState.Deleted:
entry.State = EntityState.Modified;
entry.CurrentValues["IsDeleted"] = true;
entry.CurrentValues["DeletedBy"] = userId;
entry.CurrentValues["Deleted"] = DateTime.Now;
break;
}
}
}}}
狐的传说
神不在的星期二
白板的微信
相关分类