Ef Core переносит перечисление в другой тип перечисленияC#

Место общения программистов C#
Ответить
Anonymous
 Ef Core переносит перечисление в другой тип перечисления

Сообщение Anonymous »


У меня есть проект EF, основанный на коде, с таблицей, которая использует неправильное перечисление в одном столбце, и мне нужно перенести ее с помощью EF Migrations. Мне приходится переименовывать столбец, а затем копировать старые значения в новые.

Я знаю, что могу сделать это, просто написав сценарий SQL вручную, но мне интересно, есть ли способ позволить EF Migration делать это автоматически, в стиле «сначала код»?

Перечисления хранятся в базе данных в виде строк и имеют немного разные члены (но имеют соотношение 1:1), т. е. класс

Данные общедоступного класса { общественный ИНТ Id {получить; набор; } общественный статус OldStatusType {get; набор; } } общедоступный класс DataMap: BaseConfiguration { общедоступное переопределение void Configure (построитель EntityTypeBuilder) { BaseConfigure(builder, "Данные", Schema.MySchema.ToString()); builder.HasKey(x => x.Id); builder.Property(x => x.Id).UseSqlServerIdentityColumn(); // сопоставляем перечисление со строкой строитель .Property(x => x.Status) .HasConversion() .HasMaxLength(100) .Требуется(); } } И теперь мне нужно изменить класс на

Данные общедоступного класса { общественный ИНТ Id {получить; набор; } общественное состояние NewStateType {get; набор; } // Статус -> Состояние } чтобы старые значения статуса были сопоставлены с новыми значениями состояния.

Каков правильный подход при миграции с приоритетом кода?

[Обновление]

Чтобы внести ясность, я попробовал сделать следующее:

публичный частичный класс ChangeDataEnumType: Миграция { защищенное переопределение void Up(MigrationBuildermigrationBuilder) { // переименовываем Статус в Состояние миграцияBuilder.RenameColumn( имя: "Статус", схема: "MySchema", таблица: «Данные», newName: "Штат"); // переносим значение перечисления «Старое» в «Новое» migrationBuilder.Sql("UPDATE [MySchema].[Data] SET [State] = 'New' WHERE [State] = 'Old'"); } } но это не удается:

информация: Microsoft.EntityFrameworkCore.Database.Command[20101] Выполнена команда DbCommand (2 мс) [Parameters=[], CommandType='Text'] EXEC sp_rename N'[MySchema].[Data].[Status]', N'State', N'COLUMN'; ошибка: Microsoft.EntityFrameworkCore.Database.Command[20102] Не удалось выполнить DbCommand (8 мс) [Parameters=[], CommandType='Text'] ОБНОВЛЕНИЕ [MySchema].[Данные] SET [Состояние] = «Новое» ГДЕ [Состояние] = «Старое» System.Data.SqlClient.SqlException (0x80131904): неверное имя столбца «Состояние». Но в последнем запросе вообще не упоминается «Статус», он использует новое имя столбца, поэтому я в полном замешательстве.

Если я попробую эти два оператора один за другим в SSMS (а затем откатюсь), они будут работать без проблем.
Ответить

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

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

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

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

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