我想在DB中将字符标记为false并检索真实的字符。这就是我声明的bool IsDeleted { get; set; } = true
角色服务
public async Task<ServiceResponse<List<GetCharacterDto>>> sDeleteCharacter(int id)
{
ServiceResponse<List<GetCharacterDto>> response = new ServiceResponse<List<GetCharacterDto>>();
Character character = await _context.Characters
.FirstOrDefaultAsync(c => c.Id == id && c.User.Id == GetUserId());
if (character != null)
{
character.IsDeleted = false ;
await _context.SaveChangesAsync();
response.Data = _context.Characters
.Where(c => c.User.Id == GetUserId())
.Select(c => _mapper.Map<GetCharacterDto>(c)).ToList();
}
GetAll
方法,其中我根据IsDelete
值
public async Task<ServiceResponse<List<GetCharacterDto>>> GetAllCharacters()
{
var response = new ServiceResponse<List<GetCharacterDto>>();
var dbCharacters = await _context.Characters
.Where(c => c.User.Id == GetUserId() && c.IsDeleted== true)
.ToListAsync();
response.Data = dbCharacters.Select(c => _mapper.Map<GetCharacterDto>(c)).ToList();
return response;
我解决了这个问题-只需重写savechanges()
using System;
namespace SoftDeleted.Models
{
public interface ISoftDeleted
{
bool IsDeleted { get; set; }
}
}
DB
public class DataContext : DbContext
{
public DataContext(DbContextOptions<DataContext> options) : base(options)
{
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Employee>().HasQueryFilter(b => !b.IsDeleted);
}
public override int SaveChanges()
{
HandleEmployeeDelete();
return base.SaveChanges();
}
private void HandleEmployeeDelete()
{
var entities = ChangeTracker.Entries()
.Where(e => e.State == EntityState.Deleted);
foreach(var entity in entities)
{
if (entity.Entity is Employee)
{
entity.State = EntityState.Modified;
var c= entity.Entity as Employee;
c.IsDeleted = true;
}
}
}
public DbSet<Employee> Employees { get; set; }
}
}