[英]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.