ef core utilizzando il formato del calendario di sistema per generare nomi di migrazione.
esempio di nome di migrazione standard per il calendario gregoriano su windows:
20190206144020_MIGRATION-NAME
Ma se il formato della data di Windows è diverso dal gregoriano, come il calendario persiano, il nome di migrazione dell'ef principale genera qualcosa di simile:
13971114210223_MIGRATION-NAME
in un progetto di gruppo, non possiamo usare entrambi i formati perché sta cambiando l'ordine delle migrazioni.
c'è un modo per risolvere quel problema senza cambiare il formato del calendario di Windows o rinominare manualmente la migrazione?
versione: EF core 2.2
Questo è semplicemente un bug nella classe MigrationsIdGenerator per l'ultima volta in questo momento EF Core 2.2.4 - nell'ultima riga del metodo GenerateId
:
return timestamp.ToString(Format) + "_" + name;
hanno semplicemente dimenticato di passare il metodo CultureInfo.InvariantCulture
al metodo DateTime.Format
.
È già stato corretto nel codice corrente (credo per EF Core 3.0), quindi o lo aspetti, oppure copia / incolla il codice corrente nel tuo progetto (rinomina la classe per dire FixedMigrationsIdGenerator
) e quindi all'interno della tua classe derivata DbContext
, sovrascrivere OnConfiguring
e aggiungere quanto segue (con l' using
necessario):
optionsBuilder.ReplaceService<IMigrationsIdGenerator, FixedMigrationsIdGenerator>();
Ho esteso la risposta accettata e creato una classe derivata dalla classe MigrationsIdGenerator
sovrascrive solo il metodo GenerateId
:
public class FixedMigrationsIdGenerator : MigrationsIdGenerator
{
private const string Format = "yyyyMMddHHmmss";
private DateTime _lastTimestamp = DateTime.MinValue;
private readonly object _lock = new object();
public override string GenerateId(string name)
{
var now = DateTime.UtcNow;
var timestamp = new DateTime(now.Year, now.Month, now.Day, now.Hour, now.Minute, now.Second);
lock (_lock)
{
if (timestamp <= _lastTimestamp)
{
timestamp = _lastTimestamp.AddSeconds(1);
}
_lastTimestamp = timestamp;
}
return timestamp.ToString(Format, CultureInfo.InvariantCulture) + "_" + name;
}
}