Проблема в том, что вы пытаетесь обновить экземпляр Employee
напрямую, основываясь на параметре действия, не пытаясь сначала найти какую-либо подходящую запись, следовательно, EF "не знает", нужно ли изменять сущность и обрабатывать ее состояние как EntityState.Added
в этой строке:
db.Entry(employee).State = EntityState.Modified;
Что вам нужно сделать, это использовать SingleOrDefault()
или FirstOrDefault()
для извлечения совпадающей записи на основе свойства Id
, обновить все необходимые свойства, затем присоединить экземпляр Employee
к сущности Employees
иустановить его состояние как EntityState.Modified
:
[HttpPost]
public ActionResult Edit(Employee employee)
{
if (!ModelState.IsValid)
{
var department = db.Departments.ToList();
var viewModel = new EmployeeViewModel
{
Departments = department,
Employees = db.Employees.ToList()
};
return View("Index", viewModel);
}
// find employee with matching ID first
var selectedEmployee = db.Employees.SingleOrDefault(x => x.Id == employee.Id);
// update all properties
selectedEmployee.Name = employee.Name;
// other properties here
// attach the context
db.Employees.Attach(selectedEmployee);
// set modified state and save all changes
db.Entry(selectedEmployee).State = EntityState.Modified;
db.SaveChanges();
return RedirectToAction("Index");
}
Связанные проблемы:
Почему Entity Framework повторно вставляет существующие объекты в мою базу данных?
Обновление записи с EntityState.Modified, но вставка новой строки вместо обновления