Правильный способ обновить сущность из контроллера Изменить действие? - PullRequest
1 голос
/ 19 марта 2012

Контроллер

Сначала я попробовал это:

[HttpPost]
public ActionResult Edit(JournalEntry journalentry)
{
    if (ModelState.IsValid)
    {
        db.Entry(journalentry).State = EntityState.Modified;
        db.SaveChanges();
        return RedirectToAction("Index", new { id = journalentry.Journal.JournalId });
    }
    return View(journalentry);
}

Ошибка была выдана SaveChanges():

Сообщение об ошибке:«Оператор хранилища обновлений, вставок или удалений затронул неожиданное количество строк (0). Возможно, объекты были изменены или удалены с момента загрузки объектов. Обновите записи ObjectStateManager.»

Я посмотрел на journalentry сущности и заметил, что его JournalEntryId был 0, но все остальные свойства были установлены правильно.Поэтому я изменил это на следующее:

[HttpPost]
public ActionResult Edit(int id, JournalEntry journalentry)
{
    if (ModelState.IsValid)
    {
        journalentry.JournalEntryId = id;
        db.Entry(journalentry).State = EntityState.Modified;
        db.SaveChanges();
        return RedirectToAction("Index", new { id = journalentry.Journal.JournalId });
    }
    return View(journalentry);
}

Все выглядело правильно для сохранения, но является ли это правильным способом сохранить сущность?

1 Ответ

2 голосов
/ 19 марта 2012

На самом деле вы можете переименовать свойство JournalEntryId в вашей JournalEntry модели представления в Id, и тогда связыватель модели по умолчанию автоматически заполнит его для вас, чтобы вам не приходилось писать следующую строку:

journalentry.JournalEntryId = id;

и ваш первый фрагмент кода будет работать, потому что свойство Id будет заполнено значением из маршрута.

Или если по какой-то причине вы не можете переименовать свойство в вашей модели представления (на самом деле я знаю причину => вы вообще не используете никаких моделей представления, но передаете свои доменные сущности непосредственно в представление, которое является плохим, но подверженным на другой вопрос), вы можете использовать скрытое поле в вашей форме:

@Html.HiddenFor(model => model.JournalEntryId)

или измените объявление Html.BeginForm, включив параметр в качестве аргумента строки запроса:

@Html.BeginForm("Edit", "SomeController", new { JournalEntryId = Model.JournalEntryId }, FormMethod.Post)
{
    ...        
}
...