为什么 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 来播种与迁移无关的数据。
这是 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 来播种与迁移无关的数据。