这是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应用程序中复制了此行为,并为对更多详细信息感兴趣的任何人设置了GitHub存储库。
我了解这种情况是在某个函数生成种子数据或诸如此类的结果时发生的DateTime.Now
。我不明白这里发生的情况,在播种期间为该列分配了原始布尔值。
此行为似乎与问题#13047非常相似,“将BoolToStringConverter与HasData一起使用时生成了不正确的UpdateData操作”,但该问题已在EF Core 2.2中修复。
好吧,原因是HasDefaultValue(true)
在以下模型配置代码中调用了-
modelBuilder.Entity<Job>()
.Property(e => e.IsActive)
.HasDefaultValue(true);
每当使用该HasDefaultValue()
方法为属性设置默认值时,即为数据库表中相应列设置的值。
使用HasDefaultValue(true)
,您已设置true
为IsActive
属性的默认值。因此,在种子数据中-
modelBuilder.Entity<Job>().HasData(
new Job() { IsActive = true });
IsActive
从迁移的角度来看,即使迁移之间的数据没有变化,将值设置为(无关紧要的值)也不会改变。
编辑-解决方案:
为列设置默认值的要求始终是有效要求。因此,您可能要考虑更改的另一件事是数据播种方法。
您现在使用的播种方法完全由迁移本身管理,并且存在一些限制-模型种子数据的局限性
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句