Sto cercando di creare una migrazione tra database utilizzando EF Core 2.0
Quando sono in ufficio, lavoro utilizzando un database SQL Server condiviso con il team. Per questo motivo il codice utilizza una configurazione che fa riferimento al provider del server SQL
optionsBuilder.UseSqlServer(connectionString, serverOptions => {
serverOptions.MigrationsHistoryTable("__EFMigrations", "dbo");
});
Quando viene creata una nuova migrazione, fare in modo che il codice di migrazione utilizzi la configurazione specifica del provider del server SQL come
migrationBuilder.CreateTable(
name: "Customers",
schema: "dbo",
columns: table => new
{
EntityID = table.Column<int>(nullable: false)
.Annotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn),
Name = table.Column<string>(maxLength: 255, nullable: false)
},
constraints: table => {
table.PrimaryKey("PK_Customers", x => x.EntityID);
});
Si prega di notare il metodo di Annotation
.
Quando non sono in ufficio sto usando un'istanza di PostgreSQL installata sul mio Mac e ho bisogno di una migrazione leggermente diversa che faccia uso dello specifico provider di PostgreSQL
.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.SerialColumn),
So che posso modificare manualmente la migrazione per specificare entrambe le annotazioni in quanto ciò non ha impatto durante l'esecuzione su un tipo di database specifico.
Tuttavia modificare manualmente la migrazione è un lavoro noioso e soggetto a errori che vorrei evitare.
Esiste un modo per rendere EF generare automaticamente entrambi i metodi di annotazione?
Ho anche provato a utilizzare il metodo OnModelCreating di DbContext specificando le opzioni su ModelBuilder
modelBuilder
.HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.SerialColumn)
.HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
o
modelBuilder.ForNpgsqlUseSerialColumns();
modelBuilder.ForSqlServerUseIdentityColumns();
ma la migrazione generata è sempre correlata al provider utilizzato in quel momento specifico.
Non c'è modo di convincere EF Core a farlo per te. Quello che stai facendo è l'approccio migliore. Un approccio un po 'meno noioso consiste nel mantenere due gruppi separati di migrazioni, una per ciascun provider.
Vedi Migrazioni EF core con più fornitori per maggiori dettagli.