Ho la seguente situazione, il mio design sembra così e il database ha già alcuni dati al suo interno.
public class MyContext : DbContext
{
public DbSet<MyEntity> MyEntities { get; set; }
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseSqlite("Data Source=database.db");
}
}
public class MyEntity
{
public int MyEntityId { get; set; }
public int MetaEntityId { get; set; }
public MetaEntity MetaEntity { get; set; }
}
public class MetaEntity
{
public int MetaEntityId { get; set; }
}
In seguito mi sono reso conto che quello era il mio errore e che il design avrebbe dovuto essere:
public class MyContext : DbContext
{
public DbSet<MyEntity> MyEntities { get; set; }
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseSqlite("Data Source=database.db");
}
}
public class MyEntity
{
public int MyEntityId { get; set; }
public MetaEntity MetaEntity { get; set; }
}
public class MetaEntity
{
public int MetaEntityId { get; set; }
public int MyEntityId { get; set; }
public MyEntity MyEntity { get; set; }
}
Qual è il modo migliore per applicare questa migrazione senza perdere le relazioni tra le entità? Esiste un modo all'interno del metodo Migrations Up () per ricordare le relazioni, modificare lo schema DB e quindi riapplicare le relazioni?
Ok, quindi ho trovato la soluzione (non funziona in SQLite !, il codice sopra era solo un esempio, il vero database di produzione è MySQL).
Nella nuova migrazione spostati nella posizione corretta dopo aver creato la nuova colonna e prima di rilasciare quella precedente:
migrationBuilder.Sql("UPDATE MetaEntity " +
"INNER JOIN MyEntity ON MetaEntity.MetaEntityId = MyEntity.MetaEntityId " +
"SET MetaEntity.MyEntityId = MyEntity.MyEntityId;");