修复实验成绩评分方案保存的外键失败

This commit is contained in:
biss committed 2026-08-21 17:44:28 +08:00
1 parent 0e02d446ba
commit bcdb00ee2e
2 files changed
+95 -9

No files matched your search

@@ -568,21 +568,39 @@ public sealed class ExperimentGradesController(
sheet.ContributionWeight = request.ContributionWeight;
sheet.PassScore = request.PassScore;
db.ExperimentGradeItems.RemoveRange(sheet.Items);
var existingItems = sheet.Items.ToList();
var existingItemScores = sheet.Records
.SelectMany(record => record.ItemScores)
.ToList();
// MySQL must see each replacement item before its score rows. Do not
// rely on a single mixed insert/delete batch to infer that order.
await using var transaction =
await db.Database.BeginTransactionAsync(cancellationToken);
db.ExperimentGradeItemScores.RemoveRange(existingItemScores);
db.ExperimentGradeItems.RemoveRange(existingItems);
foreach (var record in sheet.Records)
{
record.ItemScores.Clear();
record.TotalScore = null;
record.IsPassed = null;
}
sheet.Items = replacementItems;
foreach (var record in sheet.Records)
foreach (var item in replacementItems)
record.ItemScores.Add(new ExperimentGradeItemScore
{
ExperimentGradeItemId = item.Id
});
await db.SaveChangesAsync(cancellationToken);
foreach (var item in replacementItems)
item.ExperimentGradeSheetId = sheet.Id;
db.ExperimentGradeItems.AddRange(replacementItems);
await db.SaveChangesAsync(cancellationToken);
db.ExperimentGradeItemScores.AddRange(
sheet.Records.SelectMany(record => replacementItems.Select(item =>
new ExperimentGradeItemScore
{
ExperimentGradeRecordId = record.Id,
ExperimentGradeItemId = item.Id
})));
await db.SaveChangesAsync(cancellationToken);
await transaction.CommitAsync(cancellationToken);
return NoContent();
}