Искать способ сохранить данные при миграции.
Оказалось это не так просто.
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.