Использование AsNoTracking в ASP.Net Core docs - PullRequest
0 голосов
/ 05 декабря 2018

Я пытался понять использование 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?

1 Ответ

0 голосов
/ 05 декабря 2018

Тот факт, что AsNoTracking() используется при извлечении экземпляра Contact, также является причиной повторного подключения контакта к context, когда для State установлено значение EntityState.Modified - поскольку contact не являетсяотслеживаемый context, вам необходимо явно сообщить context, что эта сущность была изменена.

Если AsNoTracking() не использовалось, это не понадобилось бы.

Запросы NoTracking (MS Docs)

Как правило, вы получаете выгоду отAsNoTracking() в сценариях только для чтения (часть R CRUD )

Что касается потенциального намерения использования AsNoTracking() в фрагменте, @Panagiotis Kanavos в комментарии это IMHO место на:

"Я думаю, что я понимаю" ум "здесь - контакт загружается без отслеживания, чтобы уменьшить накладные расходы, если обновление не разрешено. Если это так, объектподключается и предпринимается попытка одобрения. В зависимости от этого состояния его окончательный статус обновляется и, наконец, сохраняется. "

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...