Sto cercando di aggiornare un progetto EF Core 1.x a 2.0. In 1.x stavo sfruttando i metodi di estensione specifici del provider (ad es. ForSqlServerHasDefaultValueSql
/ ForSqliteHasDefaultValueSql
o ForSqlServerHasColumnType
) ma sembra che siano stati rimossi in 2.0.
Dal momento che ogni fornitore ha il proprio sapore di SQL e capacità, ho bisogno di essere in grado di utilizzare configurazioni leggermente diverse o stringhe SQL per provider in OnModelCreating
. Ad esempio per impostare un valore predefinito che potrei avere:
modelBuilder<Foo>(b =>
{
b.Property(x => x.CreateDate)
.IsRequired()
.ForSqlServerHasDefaultValueSql("getutcdate()")
.ForSqliteHasDefaultValueSql("CURRENT_TIMESTAMP");
}
Come è fatto in 2.0?
Non ho trovato nulla nella documentazione (ancora) ma scavando in profondità nella fonte, c'è un commento nei registri di commit 747c86556b2a21526973d462626e299b9bde7b91 :
Rimuovi i metodi ForSqlServer ... ForSqlite ... per concetti relazionali
Parte di # 7166
Il codice può invece usare
if (Database.IsSqlServer()) { modelBuilder.HasColumnName("MySqlServerName"); }
Pertanto lo snippet nella domanda tradurrebbe in:
modelBuilder<Foo>(b =>
{
b.Property(x => x.CreateDate)
.IsRequired();
if (Database.IsSqlServer())
b.Property(x => x.CreateDate).HasDefaultValueSql("getutcdate()");
if (Database.IsSqlite())
b.Property(x => x.CreateDate).HasDefaultValueSql("CURRENT_TIMESTAMP");
}
Complimenti a @IvanStoev per avermi indirizzato alla documentazione di aggiornamento da 1.x a 2.0 . In qualche modo il mio Google-fu mi stava fallendo oggi. In questa pagina mostra chiaramente cosa fare:
Invece di utilizzare metodi come
ForSqlServerToTable
, i metodi di estensione sono ora disponibili per scrivere codice condizionale basato sul provider corrente in uso. Per esempio:modelBuilder.Entity<User>().ToTable( Database.IsSqlServer() ? "SqlServerName" : "OtherName");