You can Attach the entity to avoid loading it from DB (save performance) and update only the fields you want.
This also avoids the problem of your code when you load an instance from the DB (Result
) and track another instance with the same Id (vR
) resulting in an exception.
// POST: VRs/Edit/5
[HttpPost]
[ValidateAntiForgeryToken]
public IActionResult Edit(VR vR)
{
if (ModelState.IsValid)
{
//Attach the instance so that we don't need to load it from the DB
_context.MyVR.Attach(vR);
vR.ModifiedBy = User.Identity.Name;
vR.Modified = DateTime.Now;
//Specify the fields that should be updated.
_context.Entry(vR).Property(x => x.ModifiedBy).IsModified = true;
_context.Entry(vR).Property(x => x.Modified).IsModified = true;
_context.SaveChanges();
return RedirectToAction("Index");
}
return View(vR);
}
The other way to specify fields that should not be updated.
// POST: VRs/Edit/5
[HttpPost]
[ValidateAntiForgeryToken]
public IActionResult Edit(VR vR)
{
if (ModelState.IsValid)
{
//Attach the instance so that we don't need to load it from the DB
_context.Entry(vR).State = EntityState.Modified;
vR.ModifiedBy = User.Identity.Name;
vR.Modified = DateTime.Now;
//Specify the fields that should not be updated.
_context.Entry(vR).Property(x => x.Created).IsModified = false;
_context.Entry(vR).Property(x => x.CreatedBy).IsModified = false;
_context.SaveChanges();
return RedirectToAction("Index");
}
return View(vR);
}
In case you use a view model, you can use new
operator to create your data model and copy the fields you want to update:
// POST: VRs/Edit/5
[HttpPost]
[ValidateAntiForgeryToken]
public IActionResult Edit(VRViewModel vRVM)
{
if (ModelState.IsValid)
{
VR vR = new VR();
//Attach the instance so that we don't need to load it from the DB
_context.MyVR.Attach(vR);
//Set the Id for your model.
vR.Id = vRVM.Id;
//Let's say you also want to update this field from the VM
vR.FullName = vRVM.FullName;
vR.ModifiedBy = User.Identity.Name;
vR.Modified = DateTime.Now;
//Specify the fields that should be updated.
_context.Entry(vR).Property(x => x.ModifiedBy).IsModified = true;
_context.Entry(vR).Property(x => x.Modified).IsModified = true;
_context.Entry(vR).Property(x => x.FullName).IsModified = true;
_context.SaveChanges();
return RedirectToAction("Index");
}
//create your new view model and return it. For demonstration purpose, I return the same view model, in your real code, you can adjust it.
return View(vRVM);
}