В методе редактирования при обновлении данных создаются новые данные вместо mvc5 - PullRequest
0 голосов
/ 29 января 2019

Это мой метод редактирования контроллеров в Httpost

[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);
        }

        db.Entry(employee).State = EntityState.Modified;
        db.SaveChanges();
        return RedirectToAction("Index");
    }

этот метод создает новые данные вместо обновления данных.

1 Ответ

0 голосов
/ 30 января 2019

Проблема в том, что вы пытаетесь обновить экземпляр 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, но вставка новой строки вместо обновления

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