Как обновить EF 4 Entity в ASP.NET MVC 3?

У меня есть 2 проекта - библиотека классов, содержащая модель EDM Entity Framework и отдельный проект ASP.NET MVC.

У меня возникают проблемы с тем, как вы можете редактировать и сохранять изменения в объекте с использованием MVC. В моем контроллере у меня есть:

public class UserController : Controller
 {
 public ActionResult Edit(int id)
 {
 var rep = new UserRepository();
 var user = rep.GetById(id);
 return View(user);
 }
 [HttpPost]
 public ActionResult Edit(User user)
 {
 var rep = new UserRepository();
 rep.Update(user);
 return View(user);
 }
 }

У моего UserRepository есть метод Update, подобный этому:

public void Update(User user)
{
 using (var context = new PDS_FMPEntities())
 {
 context.Users.Attach(testUser);
 context.ObjectStateManager.ChangeObjectState(testUser, EntityState.Modified);
 context.SaveChanges();
 }
}

Теперь, когда я нажимаю "Сохранить" на странице редактирования, параметр user содержит только два значения: Id и FirstName. Я полагаю, это связано с тем, что я отображаю только эти два свойства в представлении.

Мой вопрос в том, что если я обновляю имя пользователя, а затем хочу его сохранить, что я должен делать с другими user свойствами, которые не были показаны в представлении, так как теперь они содержат 0 или NULL в объекте user?

Я много читал о том, как использовать объекты-заглушки, но я никуда не гожусь, потому что ни один из примеров, которые я видел, на самом деле не работает. то есть я продолжаю получать связанные исключения EntityKey.

Может ли кто-нибудь указать мне хороший учебник/пример того, как обновлять объекты EF 4, используя класс репозитория, вызываемый интерфейсом MVC?

6 ответов

ОК, после некоторых проб и ошибок, я считаю, что нашел решение. Вот мой обновленный метод Update в UserRepository:

public void Update(User user)
{
 using (this.Context)
 {
 var tempUser = new User { usr_id = user.usr_id };
 this.Context.Users.Attach(tempUser);
 this.Context.ApplyCurrentValues("Users", user);
 this.Context.SaveChanges();
 }
}

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


Я бы извлек пользователя из базы данных и обновил этот объект. EF не может просто волшебным образом узнать, какие значения должны быть изменены, а какие нет.

Если вы беспокоитесь о проблемах concurrency, вам нужно будет сохранить временную метку в представлении - обычно это значение скрытой формы.


Пожалуйста, просмотрите мой метод обновления по следующему вопросу: Частично обновлять объект с помощью EF Code First и ASP.NET MVC Это работает хорошо, даже когда мне не нравится, что я должен указать имена полей.


Вероятно, это немного поздно, чтобы ответить на вопрос, но, возможно, это поможет кому-то другому. Мне кажется, что основная проблема, с которой вы сталкиваетесь, связана с тем, что экземпляр контекста базы данных, который читает объект, удаляется после отображения страницы. Поэтому, когда вы пытаетесь сохранить его, это новый экземпляр контекста, который поэтому не знает о предыдущем контекстном вызове. Поэтому Entity Framework должен обновлять все строки в базе данных, поскольку он не знает, какие строки были изменены.

При этом лучший метод, который я нашел для сохранения всех старых данных, и обновление того, что я хочу изменить, - это сначала сделать новый вызов в базе данных, установив всю необходимую информацию для модели (или то, что вы используете для хранения ваших данных), к тому, что сейчас находится в БД. Затем вносите необходимые изменения в эту информацию, а затем сохраняете результат в БД.

Вы можете посмотреть учебник по внедрению Basic CRUD для получения дополнительной информации: http://www.asp.net/mvc/tutorials/getting-started-with-ef-using-mvc/implementing-basic-crud-functionality-with-the-entity-framework-in-asp-net-mvc-application


Я нашел этот учебник на веб-сайте asp.net очень полезным: Начало работы с EF с использованием MVC - Обновление связанных данных

Обратите внимание на метод TryUpdateModel, который будет обновлять связанную модель стандартным образом (настройка объекта в измененное состояние и передача всего), а затем позволит вам настроить, как некоторые свойства обновляются.

У меня возникли проблемы с ключами сущностей, и это помогло мне преодолеть эти проблемы.


http://forums.asp.net/p/1697685/5032858.aspx/1?Re+MVC3+edits+to+records+using+Entity+Framework+not+saving+to+the+database

Посмотрите ссылку выше. Я думаю, что это очень похожий случай (с решением). Удачи.

licensed under cc by-sa 3.0 with attribution.