http://www.asp.net/mvc/tutorials/getting-started-with-ef-using-mvc/implementing-basic-crud-functionality-with-the-entity-framework-in-asp-net-mvc- применение

я есть 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)

Решение Вопроса

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

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

 RPM198412 янв. 2011 г., 12:28
Да, поверьте мне, я делал много ef / mvc в последнее время. И поскольку я использую POCO без отслеживания изменений (что означает отсутствие самопроверкаемых объектов, никаких прокси-объектов, ничего), это кошмар для обновления отношений. Укуси пулю и принеси запись снова. Или, если вы обновляете только основные свойства непосредственного свойства,ApplyCurrentValues Это хорошо. Но вы должны быть последовательными. Удачи. :)
 Jason Evans12 янв. 2011 г., 12:14
@ RPM1984 - Это избавит от хлопот с навигационными свойствами. Одна проблема, которую я имею с TryUpdateModel (), это дизайн. Я пытаюсь убедиться, что я могу использовать репозиторий, чтобы иметь дело с получением / сохранением / удалением материала. Используя TryUpdateModel (), есть ли у вас предложения хорошего дизайна о том, как это кодировать? Я просто не хочу, чтобы контроллер имел дело с любым кодом, связанным с базой данных, если вы понимаете, о чем я.
 Jason Evans12 янв. 2011 г., 12:24
@RPM - Я только что попробовал пример кода, и ваше предложение прекрасно работает. Вероятно, мои опасения по поводу дизайна могут оказаться не более чем недостатком опыта работы с MVC, но я продолжу работу над проектом и посмотрю, как все пойдет с использованиемTryUpdateModel().
 RPM198412 янв. 2011 г., 12:00
@Jason Evans - это называется метод заглушки и работает только для скалярных свойств. Если у вас есть навигационное свойство, такое какUser.Addresses с которым вы связываете в своем View, выше не будет обновлять адреса. Я бы посоветовал вам снова извлечь пользователя из БД, а затем использоватьTryUpdateModel обновить объект. Смотрите мой недавний вопрос / ответ здесь для получения дополнительной информации:stackoverflow.com/questions/4653834/...
 RPM198412 янв. 2011 г., 12:19
Нет, не уверен, что ты имеешь в виду. Хотя я сделаю предположение, что в вашем репозитории будет создан стандартный метод «Сохранить», который «выясняет», является ли он новым / существующим объектом (например, на основе идентификатора). Поэтому вам не нужно вызывать хранилище. Обновление или хранилище. Добавить. Просто попробуйте UpdateModel, затем Сохранить. Если вы обращаетесь к вам, вы не хотите, чтобы ваш контролер касался вашей сущности - я не понимаю вашу озабоченность. Контроллеры предназначены для обновления модели. И все, что он делает, это обновляет «объект» - ваш репозиторий все еще связан с сохранением указанного объекта.

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

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

 bool.dev20 июн. 2012 г., 06:12
эй, было бы здорово, если бы вы также включили важный отрывок из этой ссылки.

Начало работы с EF с использованием MVC - Обновление связанных данных

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

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

 Jason Evans30 апр. 2012 г., 11:00
Спасибо за ваш вклад. Я буду держать это в моем списке ресурсов относительно EF. Очень признателен.

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

уже немного поздно, чтобы помочь ответить на вопрос, но, возможно, это поможет кому-то еще. Мне кажется, что основная проблема, с которой вы столкнулись, связана с тем фактом, что экземпляр контекста базы данных, который читает сущность, располагается после визуализации страницы. Поэтому, когда вы пытаетесь сохранить его, это новый экземпляр контекста, который поэтому не знает о предыдущем вызове контекста. Следовательно, 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- применение

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

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

Ваш ответ на вопрос