我正在開發一款游戲,玩家可以獲得積分,玩家可以獲得保存在我的資料庫中的積分。我有一種看起來像這樣的方法:
private async Task SendAnswer(Answer answer)
{
clicked = true;
answerText = answer.AnswerText;
team = await gameRepo.GetTeamByNameAndGameSession(Teamname, GameSessionId);
if (answer.isCorrect)
{
team.TeamPoints = team.TeamPoints answer.Points;
}
team.Answer = answer;
await gameRepo.UpdateTeam(team);
if (hubConnection is not null)
{
await hubConnection.SendAsync("SendTeamAnswer", team, GameSessionId);
}
}
那個作業得很好,但我也有另一個觀點:
private async Task ChooseBestAnswer(Team team)
{
var answer = currentQuestion.Answers.FirstOrDefault();
team.TeamPoints = team.TeamPoints answer.Points;
await gameRepo.UpdateTeam(team);
}
兩者都使用這種方法
public async Task UpdateTeam(Team teamToUpdate)
{
var oldTeam = await _context.Teams.FirstOrDefaultAsync(t => t.TeamName == teamToUpdate.TeamName && t.GameSessionGuid == teamToUpdate.GameSessionGuid);
if (teamToUpdate is not null)
{
oldTeam = teamToUpdate;
}
_context.SaveChangesAsync();
}
在第一種方法中,一切正常,但在第二種方法中,“oldteam”突然回傳 points = 0,盡管我可以在資料庫中看到它不是 0,這怎么可能,我使用相同的方法獲取 0哪里沒有。從資料庫回傳到“oldteam”的所有其他變數都是正確的,只是點突然為零。
有誰知道發生了什么事?
uj5u.com熱心網友回復:
這段代碼有幾個問題:
public async Task UpdateTeam(Team teamToUpdate)
{
var oldTeam = await _context.Teams.FirstOrDefaultAsync(t => t.TeamName == teamToUpdate.TeamName && t.GameSessionGuid == teamToUpdate.GameSessionGuid);
if (teamToUpdate is not null)
{
oldTeam = teamToUpdate;
}
_context.SaveChangesAsync();
}
如評論中所述,SaveChangesAsync沒有等待,但更重要的是,此代碼不會更新資料庫中的團隊。您正在加載現有團隊,但隨后只是覆寫了記憶體中的參考。這不會復制值。反而:
public async Task UpdateTeam(Team teamToUpdate)
{
if (teamToUpdate == null) throw new NullReferenceException(nameof(teamToUpdate));
var existingTeam = await _context.Teams.SingleAsync(t => t.TeamName == teamToUpdate.TeamName && t.GameSessionGuid == teamToUpdate.GameSessionGuid);
existingTeam.TeamPoints = teamToUpdate.TeamPoints;
// copy any additional fields that are allowed to be updated.
await _context.SaveChangesAsync();
}
這里要考慮的關鍵變化。盡早斷言傳遞的狀態并處理它是否無效。如果您希望找到 1 個團隊,請使用Single而不是First,如果需要一個條目,請不要使用OrDefault變體。僅當您預計可能找不到某項時才應使用這些。一旦我們有了現有的資料記錄,復制可以改變的值并呼叫SaveChanges,等待async操作。
如果預期狀態無效,此代碼將拋出例外,但它會拋出有意義的例外以在適當的級別進行處理。(而不是在不滿足假設或默默失敗時描述性較差的例外。)
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/534661.html
標籤:C#数据库实体框架
