Как обновить EF 4 Entity в ASP.NET MVC 3? - PullRequest
7 голосов
/ 12 января 2011

У меня есть 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 имеет метод обновления, подобный следующему:

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 ]

2 голосов
/ 12 января 2011

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

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

1 голос
/ 12 января 2011

ОК, после некоторых проб и ошибок, я смотрю, что нашел решение. Вот мой обновленный метод 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();
    }
}

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

0 голосов
/ 02 января 2013

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

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

Вы можете посмотреть учебное пособие по реализации базового 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

0 голосов
/ 20 июня 2012

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

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

0 голосов
/ 29 апреля 2012

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

Метод, на который следует обратить внимание, это TryUpdateModel,обновите связанную модель «стандартным» способом (установив сущность в измененное состояние и передав все в нее), а затем позволите вам настроить способ обновления определенных свойств.

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

0 голосов
/ 03 мая 2011

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

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