更改实体框架核心代码优先迁移名称格式

时间:2019-04-26 13:07:35

标签: entity-framework-core ef-migrations

ef核心使用系统日历格式来生成迁移名称。

Windows上公历的标准迁移名称示例:

20190206144020_MIGRATION-NAME

但是,如果Windows的日期格式不是格里高利历,例如波斯日历,则ef核心迁移名称将生成类似:

13971114210223_MIGRATION-NAME

在团队项目中,我们不能同时使用两种格式,因为它正在更改迁移顺序。

有什么方法可以解决该问题,而无需更改Windows日历格式或手动重命名迁移?

版本:EF core 2.2

3 个答案:

答案 0 :(得分:1)

这只是MigrationsIdGenerator类中的一个错误,这是最新一次EF Core 2.2.4的错误-在GenerateId方法的last line中:

return timestamp.ToString(Format) + "_" + name;

他们只是忘记将CultureInfo.InvariantCulture传递给DateTime.Format方法。

它是already fixed in the current code(我相信是EF Core 3.0),因此您可以等待它,或者将当前代码复制/粘贴到您的项目中(重命名该类以使之FixedMigrationsIdGenerator),然后在您的DbContext派生类中,覆盖OnConfiguring并添加以下内容(带有必要的using):

optionsBuilder.ReplaceService<IMigrationsIdGenerator, FixedMigrationsIdGenerator>();

答案 1 :(得分:0)

我已经扩展了接受的答案,并创建了一个从MigrationsIdGenerator类派生的类,该类仅覆盖了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;
    }
}

答案 2 :(得分:0)

我通常使用命令提示文件或批处理文件 (.cmd) 来自动创建名称(包括日期和时间)。这样做我只需要双击 .cmd 文件,就会执行使用我自己的自动文件名的迁移。 这是我的 .cmd 文件内容(例如 add_migrations_Identity.cmd):

For /f "tokens=2-4 delims=/ " %%a in ('date /t') do (set mydate=%%c_%%a_%%b)
For /f "tokens=1-2 delims=/:" %%a in ("%TIME: =0%") do (set mytime=%%a%%b)
dotnet ef --startup-project MyProject migrations add Identity_V%mydate%_%mytime% -o Migrations/Identity -c IdentityContext
pause

这里是我的更新 .cmd 文件(例如 update_db_Identity.cmd):

dotnet ef --startup-project MyProject database update -c IdentityContext
pause