Sto cercando di utilizzare prima le migrazioni del codice EF Core per de-normalizzare una tabella esistente.
Ho una tabella esistente LoginEvent
che i dati hanno questo aspetto:
â•”â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•—
â•‘ LoginEvent â•‘
â• â•â•â•â•╦â•â•â•â•â•â•â•â•â•â•╦â•â•â•â•â•â•â•â•â•â•â•╦â•â•â•â•â•â•â•â•â•â•â•â•╦â•â•â•â•â•â•â•â•â•£
â•‘ Id â•‘ VenueRef â•‘ VenueName â•‘ OccurredAt â•‘ UserId â•‘
â• â•â•â•â•╬â•â•â•â•â•â•â•â•â•â•╬â•â•â•â•â•â•â•â•â•â•â•╬â•â•â•â•â•â•â•â•â•â•â•â•╬â•â•â•â•â•â•â•â•â•£
â•‘ 1 â•‘ ven01 â•‘ Venue 1 â•‘ 2018-01-29 â•‘ 5 â•‘
â• â•â•â•â•╬â•â•â•â•â•â•â•â•â•â•╬â•â•â•â•â•â•â•â•â•â•â•╬â•â•â•â•â•â•â•â•â•â•â•â•╬â•â•â•â•â•â•â•â•â•£
â•‘ 2 â•‘ ven02 â•‘ Venue 2 â•‘ 2018-01-30 â•‘ 7 â•‘
â• â•â•â•â•╬â•â•â•â•â•â•â•â•â•â•╬â•â•â•â•â•â•â•â•â•â•â•╬â•â•â•â•â•â•â•â•â•â•â•â•╬â•â•â•â•â•â•â•â•â•£
â•‘ 3 â•‘ ven01 â•‘ Venue 1 â•‘ 2018-02-01 â•‘ 9 â•‘
╚â•â•â•â•â•©â•â•â•â•â•â•â•â•â•â•â•©â•â•â•â•â•â•â•â•â•â•â•â•©â•â•â•â•â•â•â•â•â•â•â•â•â•©â•â•â•â•â•â•â•â•â•
public class LoginEvent
{
[Key]
public int Id { get; set; }
public string VenueRef { get; set; }
public string VenueName { get; set; }
public DateTime OccurredAt { get; set; }
public User User { get; set; }
}
E voglio normalizzare questo in due tabelle: LoginEvent
e Venue
, in questo modo:
â•”â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•—
â•‘ LoginEvent â•‘
â• â•â•â•â•╦â•â•â•â•â•â•â•â•â•â•╦â•â•â•â•â•â•â•â•â•â•â•â•╦â•â•â•â•â•â•â•â•â•£
â•‘ Id â•‘ VenueRef â•‘ OccurredAt â•‘ UserId â•‘
â• â•â•â•â•╬â•â•â•â•â•â•â•â•â•â•╬â•â•â•â•â•â•â•â•â•â•â•â•╬â•â•â•â•â•â•â•â•â•£
â•‘ 1 â•‘ ven01 â•‘ 2018-01-29 â•‘ 5 â•‘
â• â•â•â•â•╬â•â•â•â•â•â•â•â•â•â•╬â•â•â•â•â•â•â•â•â•â•â•â•╬â•â•â•â•â•â•â•â•â•£
â•‘ 2 â•‘ ven02 â•‘ 2018-01-30 â•‘ 7 â•‘
â• â•â•â•â•╬â•â•â•â•â•â•â•â•â•â•╬â•â•â•â•â•â•â•â•â•â•â•â•╬â•â•â•â•â•â•â•â•â•£
â•‘ 3 â•‘ ven01 â•‘ 2018-02-01 â•‘ 9 â•‘
╚â•â•â•â•â•©â•â•â•â•â•â•â•â•â•â•â•©â•â•â•â•â•â•â•â•â•â•â•â•â•©â•â•â•â•â•â•â•â•â•
â•”â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•—
â•‘ Venue â•‘
â• â•â•â•â•â•â•â•â•â•â•╦â•â•â•â•â•â•â•â•â•â•â•â•£
â•‘ VenueRef â•‘ VenueName â•‘
â• â•â•â•â•â•â•â•â•â•â•╬â•â•â•â•â•â•â•â•â•â•â•â•£
â•‘ ven01 â•‘ Venue 1 â•‘
â• â•â•â•â•â•â•â•â•â•â•╬â•â•â•â•â•â•â•â•â•â•â•â•£
â•‘ ven02 â•‘ Venue 2 â•‘
╚â•â•â•â•â•â•â•â•â•â•â•©â•â•â•â•â•â•â•â•â•â•â•â•
Ora, ho fatto questo aggiungendo un nuovo oggetto dominio Venue
e facendo riferimento a LoginEvent
, in questo modo:
public class LoginEvent
{
[Key]
public int Id { get; set; }
public string VenueRef { get; set; }
public DateTime OccurredAt { get; set; }
public Venue Venue { get; set; }
public User User { get; set; }
}
public class Venue
{
[Key]
public string VenueRef { get; set; }
public string VenueName { get; set; }
}
Ho quindi creato una migrazione, che (correttamente):
Venue
VenueName
colonna VenueName
Tuttavia, ciò che devo essere in grado di fare è eseguire una migrazione dei dati tra i passaggi 1 e 2 in modo che le sedi esistenti siano nella nuova tabella prima di rilasciare la colonna e prima di impostare il vincolo (altrimenti, perderò i dati e il vincolo fallisce poiché non ho associato i luoghi).
Mi piacerebbe eseguire qualcosa di simile alla mia migrazione dei dati:
INSERT INTO Venue SELECT DISTINCT VenueRef, VenueName FROM LoginEvent
Come dovrei farlo?
È possibile eseguire qualsiasi migrationBuilder.Sql(theSqlString)
SQL usando migrationBuilder.Sql(theSqlString)
.
Nel tuo caso
migrationBuilder.Sql("INSERT INTO Venue SELECT DISTINCT VenueRef, VenueName FROM LoginEvent");
Eseguilo nella migrazione dopo aver creato la nuova tabella Venue
e prima di eliminare la vecchia colonna VenueName
.
Vedi anche Operazioni di migrazione personalizzate .