修复实验成绩评分方案保存的外键失败
This commit is contained in:
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();
|
||||
}
|
||||
|
||||
|
||||
Reference in new issue
Block a user