Я новичок в ASP.NET, поэтому мой вопрос может быть глупым и под влиянием лет использования Java / JSF.
Я хочу реализовать веб-приложение с использованием ASP.NET с MVC3 и Entity Framework 4.1. Поскольку это бизнес-приложение, оно должно быть защищено путем предотвращения манипулирования данными и параллелизма.
Таким образом, я планировал использовать оптимистическую блокировку, которую поддерживает Entity Framework. Но когда дело доходит до использования парадигмы MVC и предлагаемых ею вариантов, я не уверен, как выполнить аспекты безопасности, упомянутые выше.
Пример
У меня есть модель домена с типом сущности "customer", который имеет атрибуты
- ID (база данных PK)
- Имя
- День рождения
- Версия (используется для оптимистической блокировки)
Чтобы подготовить его к просмотру и редактировать его данные, я дополнительно использую модель представления "customerView" со следующими атрибутами
В контроллере я загружаю определенную запись из базы данных, передаю значения в модель представления и помещаю ее в строго типизированное представление. Это прекрасно работает - значение отображается в веб-форме, и я могу опубликовать изменения. Поскольку модель представления не включает идентификатор и версию (в результате чего она не является частью обратной передачи), я не могу отобразить значения обратно в модель предметной области, поскольку она потерялась во время запроса-ответа-жизненного цикла.
Конечно, я могу добавить идентификатор и версию в качестве скрытого поля ввода, которое я хотел бы избежать, так как оно позволяет манипулировать данными. Кто-то может изменить идентификатор или версию перед отправкой данных обратно, что может привести к нежелательному поведению, поскольку я не могу сравнить данные, отправленные обратно на сервер, с данными, доставленными в веб-форму (особенно идентификатор и версию).
Я думаю, что одним из способов было бы сохранить запись данных / модель предметной области (или, по крайней мере, идентификатор записи), которые я извлек перед отображением представления редактирования в сеансе, чтобы избежать отправки нежелательных полей назад и вперед, хотя я знаю, что это не лучший способ и может повлиять на производительность приложения. Как насчет использования другого состояния сеанса, кроме состояния по умолчанию, например SQL Server? Это позволило бы сохранить хотя бы одну операцию базы данных, поскольку мне не нужно загружать запись из базы данных в другой раз, чтобы передать значения из модели представления. Я могу получить запись модели домена из сеанса и даже может проверить на манипулирование данными.
Надеюсь, пример иллюстрирует проблемы, с которыми я сталкиваюсь.
Может быть, есть еще лучший способ подойти к этим вопросам. Может быть, я совсем запутался;)