(我猜你的不同客戶使用相同的帳戶登錄。)
一般例外解釋;一個實體從數據庫中獲取,然後另一個客戶端獲取相同的實體。第二個客戶端更新了實體並提交給數據庫。當第一個客戶端嘗試保存實體時,他有一個過時的髒實體。因此你得到了併發衝突!
這發生在使用Optimistic Locking時。並且AspnetBoilerplate使用該方法的性能優先級爲Pessimistic Locking。
解決方案: 在您的TokenAuthController類中修改Authenticate方法;
private readonly AsyncLock _asyncLock = new AsyncLock();
[HttpPost]
public async Task<AuthenticateResultModel> Authenticate([FromBody] AuthenticateModel model)
{
//i am using AsyncLock because there are async methods in Authenticate.
using (await _asyncLock.LockAsync())
{
var loginResult = await GetLoginResultAsync(
model.UserNameOrEmailAddress,
model.Password,
GetTenancyNameOrNull()
);
//other codes ...
}
}
對於AsyncLock圖書館看到https://github.com/StephenCleary/AsyncEx