【问题标题】:change entity framework core code first migration name format更改实体框架核心代码先迁移名称格式
【发布时间】:2021-02-20 02:07:37
【问题描述】:

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

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

20190206144020_MIGRATION-NAME

但是,如果 Windows 的日期格式不是公历,例如波斯历,则 ef 核心迁移名称会生成如下内容:

13971114210223_MIGRATION-NAME

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

有什么方法可以在不更改 Windows 日历格式或手动重命名迁移的情况下解决该问题?

版本:EF 核心 2.2

【问题讨论】:

标签: entity-framework-core entity-framework-migrations


【解决方案1】:

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

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

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

它是 already fixed in the current code(我相信是 EF Core 3.0),所以您要么等待它,要么将当前代码复制/粘贴到您的项目中(重命名类以说 FixedMigrationsIdGenerator),然后在您的 @987654329 中@派生类,覆盖OnConfiguring并添加以下内容(带有必要的usings):

optionsBuilder.ReplaceService<IMigrationsIdGenerator, FixedMigrationsIdGenerator>();

【讨论】:

    【解决方案2】:

    我扩展了接受的答案并创建了一个派生自 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;
        }
    }
    

    【讨论】:

      【解决方案3】:

      我通常使用命令提示文件或批处理文件 (.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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-06-21
        • 2013-12-29
        • 2017-10-03
        • 2021-06-27
        相关资源
        最近更新 更多