更改 entity framework 核心代码第一次迁移名称格式
change entity framework core code first migration name format
ef 核心使用系统日历格式生成迁移名称。
windows 公历的标准迁移名称示例:
20190206144020_MIGRATION-NAME
但是,如果 Windows 的日期格式不是公历,例如波斯历,则 ef 核心迁移名称会生成如下内容:
13971114210223_MIGRATION-NAME
在团队项目中,我们不能同时使用这两种格式,因为它会改变迁移的顺序。
有没有办法在不更改 windows 日历格式或手动重命名迁移的情况下解决该问题?
版本:EF 核心 2.2
这只是 GenerateId
方法的 MigrationsIdGenerator class for the latest at this time EF Core 2.2.4 - in the last line 中的一个错误:
return timestamp.ToString(Format) + "_" + name;
他们只是忘记将 CultureInfo.InvariantCulture
传递给 DateTime.Format
方法。
它是 already fixed in the current code(我相信 EF Core 3.0),所以你要么等待它,要么 copy/paste 项目的当前代码(重命名 class 让我们说FixedMigrationsIdGenerator
),然后在 DbContext
派生的 class 中,覆盖 OnConfiguring
并添加以下内容(具有必要的 using
s):
optionsBuilder.ReplaceService<IMigrationsIdGenerator, FixedMigrationsIdGenerator>();
我扩展了已接受的答案并创建了一个 class 派生自 MigrationsIdGenerator
class 仅覆盖 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;
}
}
我通常使用命令提示符文件或批处理文件(.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
ef 核心使用系统日历格式生成迁移名称。
windows 公历的标准迁移名称示例:
20190206144020_MIGRATION-NAME
但是,如果 Windows 的日期格式不是公历,例如波斯历,则 ef 核心迁移名称会生成如下内容:
13971114210223_MIGRATION-NAME
在团队项目中,我们不能同时使用这两种格式,因为它会改变迁移的顺序。
有没有办法在不更改 windows 日历格式或手动重命名迁移的情况下解决该问题?
版本:EF 核心 2.2
这只是 GenerateId
方法的 MigrationsIdGenerator class for the latest at this time EF Core 2.2.4 - in the last line 中的一个错误:
return timestamp.ToString(Format) + "_" + name;
他们只是忘记将 CultureInfo.InvariantCulture
传递给 DateTime.Format
方法。
它是 already fixed in the current code(我相信 EF Core 3.0),所以你要么等待它,要么 copy/paste 项目的当前代码(重命名 class 让我们说FixedMigrationsIdGenerator
),然后在 DbContext
派生的 class 中,覆盖 OnConfiguring
并添加以下内容(具有必要的 using
s):
optionsBuilder.ReplaceService<IMigrationsIdGenerator, FixedMigrationsIdGenerator>();
我扩展了已接受的答案并创建了一个 class 派生自 MigrationsIdGenerator
class 仅覆盖 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;
}
}
我通常使用命令提示符文件或批处理文件(.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