这是 EF Core 3.1。我有几个带有 bool 字段的模型,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 中复制了这种行为和 setup a GitHub repo对于任何对更多细节感兴趣的人。我明白 that happening when the seed data is being generated by a function ,或类似
DateTime.Now
的结果.我不明白这里发生的事情,在播种期间为列分配了原始 bool 值。这种行为似乎与 issue #13047 非常相似。 , “将 BoolToStringConverter 与 HasData 结合使用时生成的 UpdateData 操作不正确”,但该问题 was fixed in EF Core 2.2 .
最佳答案
那么原因是HasDefaultValue(true)
调用以下模型配置代码 -
modelBuilder.Entity<Job>()
.Property(e => e.IsActive)
.HasDefaultValue(true);
每当您使用 HasDefaultValue()
为属性设置默认值时方法,那个是要为数据库表中的相应列设置的值。与
HasDefaultValue(true)
, 您已设置 true
成为 IsActive
的默认值属性(property)。因此,在种子数据中——modelBuilder.Entity<Job>().HasData(
new Job() { IsActive = true });
将值设置为 IsActive
(无论值是什么都无关紧要)是从迁移的角度来看的变化,即使数据在迁移之间没有变化。编辑 - 解决方案是什么:
为列设置默认值的要求始终是有效的要求。因此,您可能考虑更改的另一件事是数据播种方法。
您现在使用的播种方法完全由迁移本身管理,并且有一些限制 - Limitations of model seed data
您可以使用 Custom initialization logic播种与迁移无关的数据。
关于.net-core - 尽管没有进行任何更改,但为什么 EF Core 在每次迁移时都会更新种子 bool 字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64199132/