簡體   English   中英

EF Core - SaveChanges 上沒有數據庫更新

[英]EF Core - no database update on SaveChanges

今天,我對 DbContext 的SaveChanges()方法沒有按預期工作感到有點驚訝。

這是我用來從 Db 獲取用戶數據的方法:

        public async Task<UserModel> GetUserByIdAsync(string Id, bool editMode)
        {
            if (editMode) return await UserDbContext.Users.FirstOrDefaultAsync(usr => usr.UserId == Id);
            else return await UserDbContext.Users.AsNoTracking().FirstOrDefaultAsync(usr => usr.UserId == Id);
        }

這是應該更新 Db 中的實體的方法:

        public async Task<bool> UpdateUserDataByAsync(UserModel updatedUser, ClaimsPrincipal currentUser)
        {
            var user = await GetUserByIdAsync(updatedUser.UserId, true);
            user = updatedUser;
            return await UserDbContext.SaveChangesByAsync(currentUser) > 0;
        }

此外, SaveChangesByAsync方法只是覆蓋SaveChanges()以自動更新一些 Db 列,如UpdatedBy

public async Task<int> SaveChangesByAsync(ClaimsPrincipal userPrincipal,
                                         CancellationToken cancellationToken = new CancellationToken())
        {
            try
            {
                DateTime now = DateTime.UtcNow;
                var entries = ChangeTracker
                    .Entries()
                    .Where(e => e.Entity is BaseModel && (
                            e.State == EntityState.Added
                            || e.State == EntityState.Modified));

                foreach (var entityEntry in entries)
                {
                    ((BaseModel)entityEntry.Entity).UpdatedDate = now;
                    ((BaseModel)entityEntry.Entity).UpdatedBy = userPrincipal.FindFirstValue("UserId") ?? "Anonymous";

                    if (entityEntry.State == EntityState.Added)
                    {
                        ((BaseModel)entityEntry.Entity).CreatedDate = now;
                        ((BaseModel)entityEntry.Entity).CreatedBy = userPrincipal.FindFirstValue("UserId") ?? "Anonymous";
                    }
                }

                return await base.SaveChangesAsync(cancellationToken);
            }
            catch (TaskCanceledException)
            {
                return await Task.FromCanceled<int>(cancellationToken);
            }

        }

最終我通過將UpdateUserDataByAsync更改為以下內容克服了這個問題:

            UserDbContext.Entry(await GetUserByIdAsync(updatedUser.UserId, true)).CurrentValues.SetValues(updatedUser);
            return await UserDbContext.SaveChangesByAsync(currentUser) > 0;

但是我想問你為什么初始版本不起作用? 由於用戶在沒有AsNoTracking()修飾符的情況下被拉取,上下文不應該繼續跟蹤任何更改,在這種情況下,這只是用更新的用戶數據簡單地updatedUser user數據嗎?

謝謝!

您可以使代碼更簡單:

public async Task<bool> UpdateUserDataByAsync(UserModel updatedUser, ClaimsPrincipal currentUser)
        {
 UserDbContext.Entry(updatedUser).State = EntityState.Modified;
 return await UserDbContext.SaveChangesByAsync(currentUser) > 0;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM