Избегайте дублирования сущностей с помощью Linq в ASP.NET Основной веб-API

#entity-framework #linq #asp.net-core-webapi

Вопрос:

Я хочу знать, как лучше всего избежать дублирования сущностей в ASP.NET Основной проект веб-API.

Представьте, что у вас есть продукт с названием и производителем, и вы хотите убедиться, что название не дублируется. Представьте, что новый продукт с именем пришел от клиента (dto), и нам нужно посмотреть, существует ли имя (сущность) уже в базе данных (с помощью EF).

  1. Вам нужно обрезать имя ( name.trim() ) как для имен из сущности, так и для dto
  2. Вам нужно удалить все пробелы между ними ( string.replace(" ", string.empty())
  3. Вам нужно изменить все на нижний регистр ( string.lower() )
  4. Наконец, вам нужно сравнить эти два

Есть ли какие-либо рекомендации, как это сделать, не написав весь код? Я пытался использовать string.compare с compareoptions подобным ignorecase , ignoresymbols а также string.equal() с ignorecase опцией, но EF выдает мне сигнал тревоги, что он не может перевести код.

br

Комментарии:

1. В принципе, для вашего сценария сравнения нет встроенного метода. Вам необходимо написать бизнес-логику для ваших требований, например, написать метод расширения для строки.

2. @TinyWang : написание метода расширения-довольно хороший сценарий , но я всегда получаю сообщение об ошибке от EF, в котором говорится, что его невозможно перевести .

3. поделитесь своим фрагментом кода и сообщениями об ошибках?

Ответ №1:

У меня есть предложение по вашему подходу.

  1. Введите другой столбец (это может быть первичный ключ с другими ключами) и сохраните имя в нижнем и нижнем регистре при вставке новой записи в эту таблицу.

Пример: Оригинальное имя : Амир Масуд Бабаи —gt; Новое значение столбца: амирмасудбабаи

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

Комментарии:

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

2. Абсолютно правильно, нам НЕ нужно создавать отдельные столбцы для каждой проверки, которую вы собираетесь выполнить. Таким образом, в этом случае вы можете определить интерфейс, называемый IValidation, и у него есть только один метод, называемый Validate(). Таким образом, вы можете реализовать это в своих конкретных классах и выполнить проверку для каждого свойства, которое вы хотите. Так чище и приятнее.