Как мне обновить только свойства моих моделей, которые изменились в MVC? - PullRequest
2 голосов
/ 18 мая 2009

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

Если пользователь1 запрашивает страницу, а затем вносит изменения в адрес, телефон и контактную информацию, но, прежде чем нажать кнопку «Сохранить», пользователь2 запрашивает ту же страницу.

Пользователь1 затем нажимает кнопку Сохранить, и вся модель обновляется с помощью TryUpdateModel (), если Пользователь2 просто добавляет некоторые детали в поле «Примечания», при сохранении метод TryUpdateModel () перезаписывает новые данные, сохраненные пользователем1, старыми данными .

Я рассмотрел сохранение исходных значений для всех свойств модели в скрытом поле формы, а затем написание пользовательского TryUpdateModel, чтобы обновлять только измененные свойства, но это выглядит слишком похоже на Viewstate, у которого мы все был более чем счастлив оставить позади, перейдя в MVC.

Есть шаблон для решения этой проблемы, о котором я не знаю?

Как бы вы справились?

Обновление: в ответ на комментарии ниже я использую Entity Framework.

Anthony

Ответы [ 4 ]

3 голосов
/ 18 мая 2009

Если у вас нет особых требований к тому, что происходит в этом случае (например, заблокировать запись, что, конечно, требует некоторой функциональности для отмены блокировки в случае, если пользователь решает не вносить изменения), я бы предложил обычный подход - это оптимистичный замок:

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

Итак:

  1. Поместить в запись целочисленное свойство "version" или guid / rowversion.
  2. Убедитесь, что оно содержится в скрытом поле в html и, следовательно, возвращается при любой отправке;
  3. Когда вы выполняете обновление, убедитесь, что версия / guid / rowversion (базы данных) записи по-прежнему совпадает со значением, которое было в скрытом поле [и добавьте 1 к целому числу "version" при обновлении, если решил пойти с этим ручным подходом.]

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

[Я предлагаю вам найти более полное объяснение всего подхода в другом месте. Конечно, если бы вы искали информацию о функциональности версии NHibernate в Google ...]

0 голосов
/ 19 мая 2009

Если вы используете LINQ to SQL в качестве ORM, он может решать проблемы, связанные с измененными значениями, используя коллекцию конфликтов. Однако, по сути, я бы согласился с комментарием Mastermind.

0 голосов
/ 18 мая 2009

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

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

Не пытайтесь написать абсолютно идеальное и безопасное приложение. Это уже хорошо, как есть. Просто используйте его, возможно, ситуация вообще не возникнет.

0 голосов
/ 18 мая 2009

Блокировка модификации страницы, когда над ней работает один пользователь, является опцией. Это делается в некоторых вики-программах, таких как докувики. В этом случае он обычно использует некоторый JavaScript, чтобы освободить блокировку после 5-10 минут бездействия, чтобы другие могли обновить ее.

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

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