#entity-framework #linq #asp.net-core-webapi
Вопрос:
Я хочу знать, как лучше всего избежать дублирования сущностей в ASP.NET Основной проект веб-API.
Представьте, что у вас есть продукт с названием и производителем, и вы хотите убедиться, что название не дублируется. Представьте, что новый продукт с именем пришел от клиента (dto), и нам нужно посмотреть, существует ли имя (сущность) уже в базе данных (с помощью EF).
- Вам нужно обрезать имя (
name.trim()
) как для имен из сущности, так и для dto - Вам нужно удалить все пробелы между ними (
string.replace(" ", string.empty())
- Вам нужно изменить все на нижний регистр (
string.lower()
) - Наконец, вам нужно сравнить эти два
Есть ли какие-либо рекомендации, как это сделать, не написав весь код? Я пытался использовать string.compare
с compareoptions
подобным ignorecase
, ignoresymbols
а также string.equal()
с ignorecase
опцией, но EF выдает мне сигнал тревоги, что он не может перевести код.
br
Комментарии:
1. В принципе, для вашего сценария сравнения нет встроенного метода. Вам необходимо написать бизнес-логику для ваших требований, например, написать метод расширения для строки.
2. @TinyWang : написание метода расширения-довольно хороший сценарий , но я всегда получаю сообщение об ошибке от EF, в котором говорится, что его невозможно перевести .
3. поделитесь своим фрагментом кода и сообщениями об ошибках?
Ответ №1:
У меня есть предложение по вашему подходу.
- Введите другой столбец (это может быть первичный ключ с другими ключами) и сохраните имя в нижнем и нижнем регистре при вставке новой записи в эту таблицу.
Пример: Оригинальное имя : Амир Масуд Бабаи —gt; Новое значение столбца: амирмасудбабаи
- И когда вы вставляете новую запись, внесите изменения в обрезку и строчные буквы и сохраните ее в базе данных. Поскольку это первичный ключ, он должен выдавать ошибку.
- Таким образом, при таком подходе вам не нужно перебирать все имена и проверять, существует ли имя уже.
Комментарии:
1. Спасибо, Ави , этот сценарий действительно классный, но у нас есть совсем другая бизнес-логика, которая также вызывает беспокойство . например, серийный номер также должен быть уникальным или иметь другую логику . итак , я думаю , что это не очень хорошая идея, что я сделал колонку для каждой бизнес-логики, верно ?
2. Абсолютно правильно, нам НЕ нужно создавать отдельные столбцы для каждой проверки, которую вы собираетесь выполнить. Таким образом, в этом случае вы можете определить интерфейс, называемый IValidation, и у него есть только один метод, называемый Validate(). Таким образом, вы можете реализовать это в своих конкретных классах и выполнить проверку для каждого свойства, которое вы хотите. Так чище и приятнее.