#entity-framework-core #dto
Вопрос:
Я разрабатываю API .net core с использованием entity framework. Я некоторое время занимался разработкой, но я новичок в entity framework. Кроме того, я пытаюсь реализовать использование объектов DTO для ограничения и уменьшения объема доступной информации. Моя проблема в следующем. Если я не передам свой уникальный идентификатор из БД обратно конечному пользователю, как я могу выполнить обновление для этого объекта?
Например, у меня есть класс, который имеет
Идентификатор, имя, фамилия, Возраст
Мой DTO обратно конечному пользователю:
Имя, фамилия, Возраст
Как я могу реализовать обновление и удаление без идентификатора?
Я знаю, что это, вероятно, глупый вопрос, и я упускаю очевидное, поэтому, пожалуйста, будьте нежны. Я искал ответ, но каждый раз, когда я ищу, я просто продолжаю находить вопросы о таблицах, в которых нет первичного ключа.
Ответ №1:
Вы не можете обновить запись, не используя идентификатор или другой первичный ключ. Например, чтобы обновить пользователя, вам нужно найти существующую запись пользователя, обновить некоторые или все свойства и сохранить. Единственным способом найти пользователя без использования идентификатора будет
var existedUser = Context.Set<User>().Where(u=> u.FirstName==dto.FirstName
amp;amp; u.LastName==dto.LastName
amp;amp; u.Age==dto.Age).FirstOrDefault();
но поскольку вам нужно обновить свойства пользователя, это означает, что имя, фамилия, Возраст или все они уже изменены в вашем Dto, поэтому вы не можете использовать их для поиска записи пользователя для обновления.
Вы можете использовать этот код, чтобы найти пользователя для удаления, но это тоже не лучшая идея, так как может быть другой пользователь с тем же именем и возрастом.
Комментарии:
1. В этом есть смысл. Так почему же все эксперты говорят о Протекающих ключах? Как они выполняют обновления, если они не возвращают ключ как часть своего объекта DTO? Извините за так много последующих действий, я просто пытаюсь все сделать правильно. Кстати, спасибо за помощь, Серж.
2. Но в чем проблема с включением идентификатора в ваш Dto? Вы получаете все свойства из базы данных, почему в нее не включен идентификатор?
3. Насколько я понимаю, отправлять системную информацию обратно конечному пользователю-плохая практика. Это тратит впустую пропускную способность, а также ставит под угрозу вашу систему. Один пример, который я получил от кого-то, заключается в том, что если вы отправите ключ, и это значение int, хакер сможет определить количество записей в вашей таблице. Я не верю, что это правда, потому что по моему опыту, при использовании ключей int значения всегда пропускаются. Но в любом случае я просто пытаюсь построить что-то более основательное и на данный момент не понимаю, как это сделать.
4. @pachyderm94 Даже токены безопасности отправляются таким образом. Все пользуются удостоверениями личности. Я никогда не видел проекта, где бы он не использовался. Ты-первый. Единственный способ сохранить информацию в тайне — это использовать протокол https. Больше ничего не работает.
5. @pachyderm94 И как вы получаете Имя,фамилию и так далее? Я могу только догадываться , что ты отправил запрос на получение с идентификатором, почему ты не используешь его сейчас?