Ядро Entity Framework: Леса для предотвращения потери данных после изменения модели / объекта - PullRequest
0 голосов
/ 02 июля 2018

У меня была следующая модель:

public class Promotion : BaseModel
{
    [Required]
    public string Description { get; set; }

    [Required]
    public string Market { get; set; }

    [Required]
    public double Price { get; set; }
}

Была создана Миграция, которая была обновлена ​​до базы данных. И некоторые акции были вставлены в базу данных. Но мне нужно было изменить Модель продвижения на это:

public class Promotion : BaseModel
{
    [Required]
    public string Description { get; set; }

    [Required]
    public Market Market { get; set; }

    [Required]
    public double Price { get; set; }
}

public class Market : BaseModel
{
    [Required]
    public string Name { get; set; }

    [Required]
    public string Adress { get; set; }
}

Когда я добавил новую миграцию, я получил предупреждение: «Операция была подмосткой, которая может привести к потере данных. Пожалуйста, проверьте точность миграций».

Это автоматически сгенерированный метод Up новой миграции:

protected override void Up(MigrationBuilder migrationBuilder)
    {
        migrationBuilder.DropColumn(
            name: "Market",
            table: "Promotions");

        migrationBuilder.AddColumn<Guid>(
            name: "MarketId",
            table: "Promotions",
            nullable: false,
            defaultValue: new Guid("00000000-0000-0000-0000-000000000000"));

        migrationBuilder.CreateTable(
            name: "Markets",
            columns: table => new
            {
                Id = table.Column<Guid>(nullable: false),
                Adress = table.Column<string>(nullable: false),
                CreatedAt = table.Column<DateTime>(nullable: false),
                DeletedAt = table.Column<DateTime>(nullable: false),
                Name = table.Column<string>(nullable: false),
                UpdatedAt = table.Column<DateTime>(nullable: false)
            },
            constraints: table =>
            {
                table.PrimaryKey("PK_Markets", x => x.Id);
            });

        migrationBuilder.CreateIndex(
            name: "IX_Promotions_MarketId",
            table: "Promotions",
            column: "MarketId");

        migrationBuilder.AddForeignKey(
            name: "FK_Promotions_Markets_MarketId",
            table: "Promotions",
            column: "MarketId",
            principalTable: "Markets",
            principalColumn: "Id",
            onDelete: ReferentialAction.Cascade);
    }

Как я могу обновить базу данных без потери данных?

1 Ответ

0 голосов
/ 02 июля 2018

Безопасный способ обновить производственную базу данных - разбить ее на несколько этапов:

  1. Добавить новую Market сущность и прикрепить ее к Promotion сущности without dropping the existing column
  2. EF сгенерирует вам миграцию - CREATE TABLE + ADD FOREIGN KEY операторов
  3. Сделайте ваш код для обновления / вставки / выбора новых значений как Market table, так и Market column, предпочитая Market table
  4. Вы развернули это. Теперь у вас есть старый столбец с данными и новая таблица, синхронизирующая новые данные.
  5. Запишите миграцию данных, которая будет копировать старые значения из Market column в Market table. Запустить его. Теперь ваши данные перемещены в новый Market table, а новые данные находятся в Market table
  6. Обновите ваш код, чтобы перестать использовать старый Market column. Разверните изменения
  7. Удалить Market column из вашей сущности. EF создаст миграцию, где столбец будет удален. Разверните это. Теперь ваши данные и схема перенесены
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...