Ef Core переносит перечисление в другой тип перечисления ⇐ C#
-
Anonymous
Ef Core переносит перечисление в другой тип перечисления
У меня есть проект 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 (а затем откатюсь), они будут работать без проблем.
У меня есть проект 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 (а затем откатюсь), они будут работать без проблем.
Мобильная версия