Ho avuto il seguente modello:
public class Promotion : BaseModel
{
[Required]
public string Description { get; set; }
[Required]
public string Market { get; set; }
[Required]
public double Price { get; set; }
}
È stata creata una migrazione che è stata aggiornata al database. E alcune promozioni sono state inserite nel database. Ma avevo bisogno di cambiare il modello di promozione con questo:
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; }
}
Quando ho aggiunto una nuova migrazione, ho ricevuto l'avviso: "Un'operazione è stata un'impalcatura che potrebbe causare la perdita di dati. Rivedi le migrazioni per verificarne l'accuratezza".
Questo è il metodo Up generato automaticamente della nuova Migrazione:
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);
}
Come posso aggiornare il database senza perdere dati?
Il modo sicuro per aggiornare il DB di produzione è di suddividerlo in più passaggi:
Market
e collegala all'entità Promotion
without dropping the existing column
CREATE TABLE
+ ADD FOREIGN KEY
statements Market table
Market column
e dalla Market column
preferendo la Market table
Market column
Market table
alla Market table
. Eseguirlo. Ora hai trasferito i tuoi dati nella nuova Market table
e nuovi dati nella Market table
Market column
. Distribuire il cambiamento Market column
dalla tua entità. EF genererà la migrazione dove la colonna verrà eliminata. Distribuire questo. Ora hai migrato i tuoi dati e lo schema