viewModel
user
nesnesinden farklıysa, kullanıcıyı oturum açıp kullanıcıyı güncelleştirmeye çalışan bir yöntem var. Gördüğüm davranış kafa karıştırıcı. "There is no user with id: 99"
(ya da id
değeri):Neden UpdateAsync (kullanıcı) yöntemim ilk kez başarısız oluyor, kullanıcı bulunamıyor?
yöntem her çalıştırıldığında user
önceden kaydedilir değil ise, hat await _userManager.UpdateAsync(user);
dışında başarısız olur. Ancak, user
daha önce giriş yapmış olan ise, satır çalışır. Örneğin bu şekilde
,
- Kullanıcı uygulaması (an giriş yapmadın) başlatıldığında ve sunucuya
viewModel
göndermek için düğmesini tıklar.viewModel
mevcutuser
'ın verilerden farklı ise - uygulama sunucusu güncellemek için çalışır, içinde
user
, - kaydeder.
- Bu güncelleştirme,
"There is no user with id: 99"
- ile tekrar başarısız olur ve aynı verileri sunucuya gönderir.
viewModel
hala mevcut veri (güncelleme başarısız son kez hatırlayamıyorum)await _userManager.UpdateAsync(user);
eser farklıdır (bu seferuser
önceki başarısız görevinden oturum edilmiştir) ve kayıt güncellenir.[UnitOfWork] public async Task<AjaxResponse> Post(MyViewModel viewModel) { try { var loginResult = await _userManager.LoginAsync(viewModel.UserName, viewModel.Password, viewModel.TenancyName); User user; if (loginResult.Result == AbpLoginResultType.Success) { await SignInAsync(loginResult.User, loginResult.Identity); user = loginResult.User; if (user.AccessToken != viewModel.AccessToken) { user.AccessToken = viewModel.AccessToken; // why does this fail the first time? await _userManager.UpdateAsync(user); } } else { /* do some other UnitOfWork stuff below */ } return new AjaxResponse(new MyResult { Name = user.Name + " " + user.Surname, UserName = user.UserName, EmailAddress = user.EmailAddress, IsActive = user.IsActive, Success = true, UserId = user.UserId, }); } catch (Exception ex) { throw new HttpException((int)HttpStatusCode.InternalServerError, ex.Message); } }
ben id 99 sahip bir kullanıcı aslında veritabanında mevcut yapar teyit edebiliriz:
aşağıdaki yöntemdir.
exec sp_executesql N'SELECT TOP (1)
[Extent1].[Id] AS [Id],
[Extent1].[AccessToken] AS [AccessToken],
[Extent1].[UserId] AS [UserId],
[Extent1].[EmailAddress] AS [EmailAddress],
[Extent1].[TenantId] AS [TenantId],
[Extent1].[IsDeleted] AS [IsDeleted],
-- irrelevant stuff removed
FROM [dbo].[AbpUsers] AS [Extent1]
WHERE
((([Extent1].[TenantId] IS NULL) AND (@DynamicFilterParam_1 IS NULL))
OR (([Extent1].[TenantId] IS NOT NULL) AND ([Extent1].[TenantId] = @DynamicFilterParam_1))
OR (@DynamicFilterParam_2 IS NOT NULL)) AND (([Extent1].[IsDeleted] = @DynamicFilterParam_3)
OR (@DynamicFilterParam_4 IS NOT NULL)) AND ([Extent1].[EmailAddress] = @p__linq__0)',
N'@DynamicFilterParam_1 int,@DynamicFilterParam_2 bit,@DynamicFilterParam_3 bit,@DynamicFilterParam_4 bit,@p__linq__0 nvarchar(4000)'
,@DynamicFilterParam_1=NULL,@DynamicFilterParam_2=NULL,@DynamicFilterParam_3=0,@DynamicFilterParam_4=NULL,@p__linq__0=N'[email protected]'
: Kayıt için
aşağıdaki güncellemeden önce işletilirse
ex.StackTrace
at Abp.Authorization.Users.AbpUserManager`3.<GetUserByIdAsync>d__5b.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at Abp.Authorization.Users.AbpUserManager`3.<UpdateAsync>d__64.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()
at MyProject.Web.Controllers.Api.AccountApiController.<Post>d__16.MoveNext() in C:\dev\MyProject\MyProject.Web\Controllers\Api\AccountApiController.cs:line 146
içeriği Bir ipucu (SQL Server Profiler ile yakalanan) Aşağıdaki sorguda olabileceğini düşünüyorum
Burada @DynamicFilterParam_1=NULL
görüyoruz. @DynamicFilterParam_1
değişkeni [Extent1].[TenantId]
değerine karşılık gelir. 2
değerini (db'deki kayıtla ilişkili değer olan) NULL
yerine el ile atarsam ve sorguyu yeniden çalıştırırsam, beklediğim gibi kaydı verir.
I yöntem olup ikinci zaman çalıştırmak zaman, TenantId doğru TenantId tekabül eden değer NULL ilk kez tahsis edilmektedir neden 2.
değeri atanır görebilir? Neden her ilk kez UpdateAsync
yöntemi başarısız oluyor? Çalıştırmak için ne yapabilirim? Aşağıdaki talebe yanıt olarak
, UpdateAsync tanımı Bu, çoklu müşteri ait the asp.net boilerplate github
pls UpdateAsync için kaynak bir bağlantı ekledik UpdateAsync – Viru
kodunu sonrası olduğunu. GitHub'da. – DaveDev
Merhaba, @DaveDev, Şu anda aynı sorunla karşı karşıyayım. Tesadüfen bir çözüm buldunuz mu? – Vlad