abp venxt 中的UpdateAsync


今天來說一下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和數據庫的值一樣就行

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM