Причина
Я думаю, причина в том, что у вас есть TournamentBatch
привязка со стороны клиента.
Давайте рассмотрим метод OnPostAsync()
:
public async Task<IActionResult> OnPostAsync(Guid? id)
{
try
{
if (await _context.TournamentBatch.AnyAsync(
m => m.TournamentBatchID == id))
{
_context.TournamentBatch.Remove(TournamentBatch);
_logger.LogInformation($"TournamentBatch.BeforeSaveChangesAsync ... ");
await _context.SaveChangesAsync();
_logger.LogInformation($"DbInitializer.AfterSaveChangesAsync ... ");
}
return RedirectToPage("./Index");
}
// ....
}
Здесь TournamentBatch
является свойством PageModel :
[BindProperty]
public Models.TournamentBatch TournamentBatch{ get; set; }
Примечание вы не извлекли его из базы данных по идентификатору , и вы просто удалили его _context.TournamentBatch.Remove(TournamentBatch);
напрямую .
Другими словами, другие свойства TournamentBatch
будут установлены ModelBinding.Допустим, если вы отправите только Id, все остальные свойства будут использоваться по умолчанию.Например, Host
будет нулевым, а HostID
будет значением по умолчанию 00000000-0000-0000-0000-000000000000
.Поэтому, когда вы сохраняете изменения, EF Core обновит модель, как показано ниже:
UPDATE [TournamentBatch]
SET [HostID] = '00000000-0000-0000-0000-000000000000' ,
[IsDeleted] = 1 ,
# ... other fields
WHERE [TournamentBatchID] = 'A6F5002A-60CA-4B45-D343-08D660167B06'
Поскольку нет записи хоста, чей идентификатор равен 00000000-0000-0000-0000-000000000000
, база данных будет жаловаться:
Оператор UPDATE конфликтовал с ограничением FOREIGN KEY "FK_TournamentBatch_Host_HostID".Конфликт произошел в базе данных «App-93a194ca-9622-487c-94cf-bcbe648c6556», таблица «dbo.Host», столбец «Id».Оператор был прерван.
Как исправить
Вместо того, чтобы связывать TournamentBatch
со стороны клиента, вам нужно получить TournamentBatch
с серверана TournamentBatch = await _context.TournamentBatch.FindAsync(id);
.Таким образом, все свойства будут установлены правильно, поэтому EF будет корректно обновлять поле:
try
{
//var tournamentBatchItems = await _context.TournamentBatchItem.Where(m => m.TournamentBatchID == id).ToListAsync();
//_context.TournamentBatchItem.RemoveRange(tournamentBatchItems);
//await _context.SaveChangesAsync();
TournamentBatch = await _context.TournamentBatch.FindAsync(id);
if (TournamentBatch != null)
{
// Department.rowVersion value is from when the entity
// was fetched. If it doesn't match the DB, a
// DbUpdateConcurrencyException exception is thrown.
_context.TournamentBatch.Remove(TournamentBatch);
_logger.LogInformation($"TournamentBatch.BeforeSaveChangesAsync ... ");
await _context.SaveChangesAsync();
_logger.LogInformation($"DbInitializer.AfterSaveChangesAsync ... ");
}
return RedirectToPage("./Index");
}
// ...