Automapper отлично подходит для сопоставления сущности с моделью представления, но я бы не использовал его для сопоставления модели представления с сущностью. Это может показаться удобным, но вы фактически безоговорочно доверяете данным, полученным от клиента, и перезаписываете данные своей базы данных. Это означает, что вы должны отправить клиенту 100% модели вашего домена сущности, раскрывая больше информации о структуре вашего домена, чем вам нужно, и затем принять эту расширенную модель домена, которая может содержать изменения, которые ваше клиентское приложение не собирается делать. (перехват сообщения на сервере в отладчике браузера и изменение значений в объекте, отправленном обратно на сервер)
Действия отправки должны быть закодированы в:
- Подтвердите, что текущий пользователь сеанса имеет право изменять записи, указанные в запросе на отправку.
- Ограничить обновление конкретными значениями, указанными в запросе.
- Подтвердите эти конкретные значения.
- Отключите сеанс пользователя и сообщите администраторам, если что-либо из перечисленного нарушено.
В некоторых случаях, например при добавлении новой сущности, полезная нагрузка будет фактически полной сущностью и, возможно, некоторыми связанными деталями. Это все еще необходимо проверить в соответствии с известным состоянием данных. В других случаях, когда вы предоставляете действие, которое обновляет объект, опубликованная модель должна просто содержать идентификатор обновляемого объекта и конкретные значения, которые клиент может обновлять. (не весь измененный объект)
Передавая сущности или просматривая модели, которые отображаются непосредственно на сущности для метода, предназначенного для обновления некоторых аспектов сущности, я могу:
- Переназначить эту сущность кому-то еще.
- Используйте запрос, чтобы попытаться присвоить себе другую случайную сущность.
- Отрицать или иным образом изменять любые данные, записанные в этом объекте.
Не доверяйте ничему, полученному от клиента.
Эта проблема также связана с проблемой одновременного доступа, когда ваша система использует сценарий «последний выиграл». Между моментом, когда вы предоставили модель объекта / представления, и временем, когда вы отправили модель представления обратно на сервер, эти данные объекта могли измениться. Сопоставляя данные в новый класс сущностей, прикрепляя, помечая измененные и сохраняя, вы перезаписываете данные, не обращая внимания на то, были ли данные устаревшими.
Чтобы избежать проблемы, с которой вы сталкиваетесь, и проблем с безопасностью / устареванием, вы должны загрузить сущность из контекста при обновлении после вызова, проверить авторизацию для текущего пользователя, проверить номер строки # или временную метку, чтобы убедиться, что запись не устарела, проверьте обновленные данные, а затем, когда вы абсолютно уверены, что данные в вашей модели представления не представляют риска для вашей сущности, вы можете использовать .Map(source, detination)
для автоматического копирования значений. Если вам необходимо обновить связанные сущности для моделей связанных представлений, то, если вы .Include()
связывает эти связанные сущности при извлечении сущности из контекста, то вызов .Map()
должен обрабатывать связанные данные.