EF Core — параметр типа Enum Array как строковый массив (string[]) вместо Int Array (int[]) в базе данныхC#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 EF Core — параметр типа Enum Array как строковый массив (string[]) вместо Int Array (int[]) в базе данных

Сообщение Anonymous »

Я пытаюсь преобразовать Enum[] в string[] и обратно в Enum[], но когда значения преобразуются в базе данных, они преобразуются как int[] который с точки зрения надежности может измениться. Если позже будет удален один элемент типа Enum, смещение приведет к тому, что все значения после этого индекса станут недействительными, а не только «один» элемент, который, возможно, будет приведен к значению по умолчанию. Поэтому я хотел бы преобразовать любой Enum[] в string[], аналогичный string.Join.
Однако для такого процесса процесс кажется слишком сложным. простая задача.
Интересно, я что-то пропустил?
Пример в EF Core:

Код: Выделить всё

public enum EntityEnum
{
One,
Two,
Three
}

public class Entity
{
public EntityEnum[] Items { get; set; }

public static void GetEntityBuilder(EntityTypeBuilder entity)
{
entity.Property(e => e.Items)
.HasMaxLength(100)
.HasDefaultValue(null)
.ValueGeneratedNever()
.IsRequired(false);
}
}
В базе данных это будет «[0, 1, 2]» для:

Код: Выделить всё

new EntityEnum[] { EntityEnum.One, EntityEnum.Two, EntityEnum.Three }
но это должно быть «[Один, Два, Три]». Таким образом, если в какой-то момент Два будет удалено, Три все равно останется Три, а не 1.
Я пробовал вручную с помощью HasConversion, как я уже говорил ранее, но это кажется слишком сложным. В конце концов, для этого требуется ValueComparer (для строки). Кроме того, изменение преобразования по умолчанию может привести к поломке некоторых встроенных селекторов и еще много чего? Поэтому я хотел бы сохранить как можно больше нетронутым.
Есть ли какое-нибудь решение этой проблемы? Или я застрял на ручном преобразовании, которое потенциально нарушает некоторые запросы, которые можно было бы поддерживать с помощью int[], сохраненного в базе данных?
Обновление с некоторыми пояснениями:
  • Перечисления нужны, поскольку они управляются кодом, а строки анонимны.
  • Битовая маска/HasFlag EntityEnum делает это не поддерживать сортировку сохраненных массив
  • Читаемость предпочтительна, поскольку его можно не запрашивать, но можно экспортировать во внешнюю поисковую систему, которая позже выполнит синтаксический анализ.
  • Читаемость является предпочтительной и С НАСТОЯЩЕГО МОМЕНТА никакие запросы в этом столбце использоваться не будут, но вопрос останется, если он изменится позже.
Цель вопроса
HasConversion – предпочтительный метод. Я спрашиваю о. Без специального ValueComparer/ValueConverter — какие типы запросов поддерживаются при сохранении EntityEnum[] как [0, 1, 2] в базе данных и почему они не поддерживаются при сохранении EntityEnum[] как [Один, Два, Три] или [ Три, Два, Один]? И есть ли способ добавить поддержку подобных запросов и почему бы и нет? Стандартный сериализатор JSON сегодня волшебным образом обрабатывает любую строку, которая соответствует любому Enum. Если оба «работающих» запроса выполняются в коде, то я не вижу смысла в HasConversion, если это нарушает встроенные преобразования. Если запрос преобразуется в реальный запрос SQL, это совсем другое дело. Но опять же, он, вероятно, мог бы справиться с этим преобразованием так же хорошо, если бы были int[], string[], поскольку в конце концов это все равно столбец varchar (технически это просто строки). Здесь ему также придется совершить какое-то волшебство, преобразовав его во что-то, доступное для запроса, если он выполняет запрос в реальной базе данных.

Подробнее здесь: https://stackoverflow.com/questions/793 ... ead-of-int
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»