今天來說一下abp vnext 中UpdateAsync 不能修改(鎖的問題),查看執行sql 發現 where 后面不僅有Id= 還有 and ConcurrencyStamp=,所以不能修改,要想修改就得先獲取再修改,這有什么意義呢?其實這個就在於如下配置,獲取就有意義了,獲取對象后就給表的行加了鎖(進程內),其他人就無法修改,ConcurrencyStamp每次修改完都會變動,所以,頁面上如果獲取的不是最新的就無法修改
Check.NotNull(builder, nameof(builder)); builder.Entity<AccountNo>(b=> { b.ToTable(ExamplesConsts.DbTablePrefix+"AccountNo"); b.ConfigureByConvention(); b.Property(x => x.ConcurrencyStamp).IsConcurrencyToken(); 如果配置了他 });
而且線程中不能存在倆個AccountNo對象,如果有倆個對象修改也會失敗
//var e = ObjectMapper.Map<AccountNoDto, AccountNo>(dto); var xxx= await _repo.GetAsync(t=>t.Id.Equals(dto.Id)); //e.ConcurrencyStamp = xxx.ConcurrencyStamp; //await _repo.DeleteAsync(x => x.Id.Equals(dto.Id)) ; xxx.UserName = dto.UserName; xxx.Password = dto.Password; var rlt = await _repo.UpdateAsync(xxx); dto = ObjectMapper.Map<AccountNo, AccountNoDto>(rlt);
如上代碼,如果使用automap映射的對象去修改就會報錯應為這個時候AccountNo對象不唯一,修改如上使用獲取到的對象,進行修改,就沒有問題了,如果不設置b.Property(x => x.ConcurrencyStamp).IsConcurrencyToken()怎么使用都行,只要有ConcurrencyStamp和數據庫的值一樣就行