Должен ли я использовать AsNoTracking при возврате только одной записи? - PullRequest
0 голосов
/ 26 июня 2018

Я новичок в asp.net mvc, и недавно я столкнулся с методом AsNoTracking (). Я провел небольшое исследование и выяснил, что AsNoTracking () помогает повысить производительность. Его следует использовать с запросами, в которых мы не хотим сохранять данные обратно в базу данных. Итак, я знаю, что AsNoTracking () помогает повысить производительность, если вы возвращаете от сотен до тысяч записей. Однако, что мне было интересно, так это то, что, если вы возвращаете только одну запись ?. Например, запись о конкретном сотруднике. Есть ли необходимость использовать AsNoTracking ()?

1 Ответ

0 голосов
/ 26 июня 2018

Будет полезно знать, что там, где может потребоваться AsNoTracking ().

В определенном сценарии, когда вы публикуете вызов Edit и перед тем, как фактически обновить модель в базе данных, вы пытаетесь проверить, существует ли конкретная запись или нет, и затем вы хотите выполнить вызов Update, он вызовет исключение. Ниже приведена демонстрация такого сценария.

public ActionResult Edit(Model model)
{
    var modelFromDb = db.Model.Where(x => x.ID == model.ID);

    if (modelFromDb.Count() > 0)
    {
        db.Entry(model).State = EntityState.Modified; //THIS IS WHERE THE ERROR WILL BE THROWN AS RECORD WITH ID IS ALREADY ATTACHED WITH modelFromDb OBJECT.
        db.SaveChanges();
        return RedirectToAction("Index");
    }
    return View(model);
}

Вы найдете много вопросов об ошибке, например: «Не удалось присоединить объект типа MODELNAME», поскольку другой объект того же типа уже имеет такое же значение первичного ключа », что может быть вызвано приведенным выше фрагментом.

AsNoTracking () может предотвратить такие исключения. Предлагаемый код будет как ниже.

public ActionResult Edit(Model model)
{
    var modelFromDb = db.Model.AsNoTracking().Where(x => x.ID == model.ID);

    if (modelFromDb.Count() > 0)
    {
        db.Entry(model).State = EntityState.Modified; //WORKS PERFECTLY.
        db.SaveChanges();
        return RedirectToAction("Index");
    }
    return View(model);
}

Вы можете сослаться на один такой вопрос, заданный здесь ASP.NET MVC - Не удалось подключить объект типа 'MODELNAME', поскольку другой объект того же типа уже имеет то же значение первичного ключа

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