Я пытался понять использование AsNoTracking при редактировании сущности в следующем коде из документации ASP.Net Core, найден здесь :
public async Task<IActionResult> OnPostAsync(int id)
{
if (!ModelState.IsValid)
{
return Page();
}
// Fetch Contact from DB to get OwnerID.
var contact = await Context
.Contact.AsNoTracking()
.FirstOrDefaultAsync(m => m.ContactId == id);
if (contact == null)
{
return NotFound();
}
var isAuthorized = await AuthorizationService.AuthorizeAsync(
User, contact,
ContactOperations.Update);
if (!isAuthorized.Succeeded)
{
return new ChallengeResult();
}
Contact.OwnerID = contact.OwnerID;
Context.Attach(Contact).State = EntityState.Modified;
…
await Context.SaveChangesAsync();
return RedirectToPage("./Index");
}
Сводка дляAsNoTracking заявляет:
Отключение отслеживания изменений полезно для сценариев только для чтения, поскольку позволяет избежать накладных расходов при настройке отслеживания изменений для каждого экземпляра объекта.Не следует отключать отслеживание изменений, если вы хотите манипулировать экземплярами сущностей и сохранять эти изменения в базе данных с помощью Microsoft.EntityFrameworkCore.DbContext.SaveChanges.
Очевидно, что это сценарий не только для чтения, иЕдинственная причина, по которой этот метод работает, - попытка обновить сущность в базе данных.
Существует ли объяснение того, почему этот код противоречит рекомендациям, приведенным в сводке AsNoTracking?