为什么 EF Core 会在每次迁移时更新种子布尔字段,尽管没有进行任何更改?

Why does EF Core update seeded boolean fields on every migration, despite no changes being made?

这是 EF Core 3.1。我有几个带有布尔字段的模型,IsActive,定义如下:

public class Job
{
    public bool? IsActive { get; set; }
}

我的种子数据是这样的:

modelBuilder.Entity<Job>()
    .Property(e => e.IsActive)
    .HasDefaultValue(true);

modelBuilder.Entity<Job>().HasData(
    new Job() { IsActive = true });

每次我创建一个迁移(包括如果我 运行 没有做任何更改的迁移,它应该生成一个空迁移),它有一个 UpdateData 调用上面的字段,比如所以:

migrationBuilder.UpdateData(
    table: "Jobs",
    keyColumn: "id",
    keyValue: 1L,
    column: "IsActive",
    value: true);

我还在 TodoApi app and setup a GitHub repo 中为任何对更多细节感兴趣的人复制了此行为。

我理解 ,或者类似 DateTime.Now 的结果。当在播种期间为列分配原始布尔值时,我不明白这里发生了什么。

此行为似乎与 issue #13047, "Incorrect UpdateData operations generated when using BoolToStringConverter with HasData", but that issue was fixed in EF Core 2.2.

非常相似

原因是下面模型配置代码中的HasDefaultValue(true)调用-

modelBuilder.Entity<Job>()
    .Property(e => e.IsActive)
    .HasDefaultValue(true);

每当您使用 HasDefaultValue() 方法为 属性 设置默认值时,that 就是要为数据库 table.

使用 HasDefaultValue(true),您已将 true 设置为 IsActive 属性 的默认值。因此,在种子数据中 -

modelBuilder.Entity<Job>().HasData(
    new Job() { IsActive = true });

将值设置为 IsActive(不管值是什么)从迁移的角度来看是一种变化,即使数据在迁移之间没有变化。

编辑 - 解决方案是什么:
为列设置默认值的要求始终是有效的要求。因此,您可能考虑更改的另一件事是数据播种方法。

您现在使用的播种方法完全由迁移本身管理,并且有一些限制 - Limitations of model seed data

您可以使用 Custom initialization logic 来播种与迁移无关的数据。