ef core сохранить данные при миграции
От: varenikAA  
Дата: 06.11.20 03:26
Оценка:
Искать способ сохранить данные при миграции.
Оказалось это не так просто.
1. нужно способ выполнить запрос к старым данным.
2. сделать это до миграции.
3. восстановить данные в новую структуру.
4. сделать все в одной транзакции.
5. сделать это строго в рамках заданной миграции.

1. выполнить запрос внутри миграции невозможно, только Insert Update.
4. В одной транзакции выполнить не получается если навешивать вокруг миграции, т.к. она миграция создает свою.

В итоге вышло так:
 protected override void Up(MigrationBuilder migrationBuilder)
        {
            Action dropTempTable = () => migrationBuilder.Sql("drop table if exists #ClientAdmins");
            dropTempTable();
            migrationBuilder.Sql("SELECT Id, AdminId INTO #ClientAdmins FROM Clients WHERE NOT AdminId IS NULL; UPDATE Clients SET AdminId = NULL");

/*          migrationBuilder.CreateIndex(
                name: "UC_Senior", */

            migrationBuilder.Sql(@" DECLARE @Id INT, @ClientId INT, @AdminId INT, @PersonId INT, @Rows INT, @CUR INT
                                    SELECT @Rows = COUNT(*) FROM #ClientAdmins
                                    SET @Cur = 1;

                                    WHILE(@Cur <= @Rows) BEGIN
                                        PRINT @Cur
                                        SELECT TOP(1)  @ClientId = Id,  @AdminId = AdminId FROM #ClientAdmins
                                        INSERT INTO Seniors(ClientId, PersonId) VALUES(@ClientId, @AdminId)
                                        SELECT @Id = SCOPE_IDENTITY()
                                        DELETE FROM #ClientAdmins WHERE  Id = @ClientId AND  AdminId = @AdminId
                                        UPDATE Clients SET AdminId = @Id WHERE Id = @ClientId
                                        SET @Cur = @Cur + 1;
                                    END");

            dropTempTable();
        }


Нет ли способа лучше? Решение получилось без Down case и vendor specific.
☭ ✊ В мире нет ничего, кроме движущейся материи.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.