仅返回单个记录时应使用AsNoTracking吗?

时间:2018-06-26 09:32:48

标签: asp.net-mvc

我是asp.net mvc的新手,最近遇到了一个名为AsNoTracking()的方法。我进行了一些研究,发现AsNoTracking()有助于提高性能。它应与我们不希望将数据保存回数据库的查询一起使用。所以我知道,如果您要返回数百到数千条记录,AsNoTracking()有助于提高性能。但是,我想知道的是,如果您只返回一个记录,该怎么办?例如特定员工的记录。是否需要使用AsNoTracking()?

1 个答案:

答案 0 :(得分:0)

知道在哪里需要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 - Attaching an entity of type 'MODELNAME' failed because another entity of the same type already has the same primary key value

提出的这样一个问题