private async Task SetAsync(Guid userId, Action <UserSetting> setFunction, CancellationToken ct) { var setting = await _storage.UserSettings .FirstOrDefaultAsync(x => x.UserId == userId, ct); if (setting == null) { setting = new UserSetting(); var change = setting.CreateWithLog(userId, x => { x.Id = Guid.NewGuid(); x.UserId = userId; setFunction(x); x.CreateDateTime = DateTime.UtcNow; }); await _storage.AddAsync(setting, ct); await _storage.AddAsync(change, ct); } else { var change = setting.UpdateWithLog(userId, x => { setFunction(x); x.ModifyDateTime = DateTime.UtcNow; }); _storage.Update(setting); await _storage.AddAsync(change, ct); } await _storage.SaveChangesAsync(ct); }