ASP.NET - Как структурировать модели и представления MVC3 с помощью Entity Framework? - PullRequest
1 голос
/ 31 января 2012

Я новичок в ASP.NET, поэтому мой вопрос может быть глупым и под влиянием лет использования Java / JSF.

Я хочу реализовать веб-приложение с использованием ASP.NET с MVC3 и Entity Framework 4.1. Поскольку это бизнес-приложение, оно должно быть защищено путем предотвращения манипулирования данными и параллелизма.

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

Пример

У меня есть модель домена с типом сущности "customer", который имеет атрибуты

  • ID (база данных PK)
  • Имя
  • День рождения
  • Версия (используется для оптимистической блокировки)

Чтобы подготовить его к просмотру и редактировать его данные, я дополнительно использую модель представления "customerView" со следующими атрибутами

  • Имя

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

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

Я думаю, что одним из способов было бы сохранить запись данных / модель предметной области (или, по крайней мере, идентификатор записи), которые я извлек перед отображением представления редактирования в сеансе, чтобы избежать отправки нежелательных полей назад и вперед, хотя я знаю, что это не лучший способ и может повлиять на производительность приложения. Как насчет использования другого состояния сеанса, кроме состояния по умолчанию, например SQL Server? Это позволило бы сохранить хотя бы одну операцию базы данных, поскольку мне не нужно загружать запись из базы данных в другой раз, чтобы передать значения из модели представления. Я могу получить запись модели домена из сеанса и даже может проверить на манипулирование данными.

Надеюсь, пример иллюстрирует проблемы, с которыми я сталкиваюсь.

Может быть, есть еще лучший способ подойти к этим вопросам. Может быть, я совсем запутался;)

Ответы [ 2 ]

0 голосов
/ 30 июля 2012

Вы должны будете указать свой идентификатор в своем представлении, другого пути нет.Что касается манипулирования данными - вам придется проверять (при каждом сохранении), что пользователю разрешено изменять объект с этим идентификатором.

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

0 голосов
/ 31 января 2012

Когда речь идет об условиях гонки, первый вопрос, который следует задать, должен быть: Какова вероятность одновременной активности, которая фактически приводит к неверной записи?

В вашем случае: если у вас есть Клиент с ID, Именем и Днем Рождения, я не могу вспомнить общий сценарий, когда два одновременно работающих пользователя будут одновременно редактировать клиента И вводить разные данные. Почему один пользователь вводит одно имя или день рождения, а кто-то другой одновременно вводит другое имя или день рождения?

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

Очень хорошая статья на тему: Расовые условия не существуют Уди Дахан

...