.net-core - 尽管没有进行任何更改,但为什么 EF Core 在每次迁移时都会更新种子 bool 字段?

标签 .net-core entity-framework-core entity-framework-core-3.1

这是 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/

相关文章:

c# - dotnet run --https 的项目问题

c# - 如何通过 NuGet 包共享源代码以用于 .NET Core 项目

c# - OData 抛出 URI 中指定的查询无效

azure - 使用 LocalDb 与 EF Core 项目 + Azure 管道进行单元测试

c# - 按定制订单订购商品

c# - 如何在抽象类中实现依赖注入(inject)

wcf - 从.net core调用Service Fabric

entity-framework-core - 使用 Microsoft.EntityFrameworkCore.InMemory 测试并发 token

c# - 2 外键作为主键使用 EF Core 2.0 Code First

c# - Entity Framework Core 和 Cosmos DB。使用 LINQ 表达式读取实体