EF核心迁移-播种数据时违反PK

时间:2020-05-12 07:02:27

标签: c# ef-code-first seeding ef-core-3.0

我正在使用一个现有项目,该项目具有一个数据库,其中包含通过SQL Server \ SSMS手动创建的数据。

在项目的其他部分,其他人来了并创建了种子数据\配置文件。这是我被引入解决方案并创建新迁移文件的地方,发现我收到错误:

PRIMARY KEY约束'PK_AnswerTypes'。无法在对象“ forms.AnswerTypes”中插入重复键。重复的键值为(1)

通过Azure管道查看,自创建配置文件以来,这似乎是一个问题。

配置代码为

    public void Configure(EntityTypeBuilder<FieldType> builder)
    {
        if (builder == null)
        {
            throw new ArgumentNullException(nameof(builder));
        }

        builder.ToTable("FieldTypes", FormEngineSchemas.Forms);

        // TODO: convert to enum
        builder.HasData(
            new FieldType
            {
                FieldTypeId = 1,
                FieldTypes = "NUMBER"
            },
            new FieldType
            {
                FieldTypeId = 2,
                FieldTypes = "DROPDOWN"
            },
            new FieldType
            {
                FieldTypeId = 3,
                FieldTypes = "DATE"
            });
    }

上标是

protected override void Up(MigrationBuilder migrationBuilder)
{
    migrationBuilder.InsertData(
        schema: "forms",
        table: "AnswerTypes",
        columns: new[] { "AnswerTypeId", "AnswerTypes" },
        values: new object[,]
        {
            { 1, "Range" },
            { 2, "Length" },
            { 3, "regex" }
        });      
}

如果有人可以帮助建议我如何通过此方法,我将不胜感激,因为我不想删除潜在的孤立记录或删除失败的风险,因此不必删除数据库中的现有数据。

我看了一眼,这是我所看到的最接近的问题

https://github.com/dotnet/efcore/issues/12324

在这里看起来播种已正确完成

https://www.learnentityframeworkcore.com/migrations/seeding

https://docs.microsoft.com/en-us/archive/msdn-magazine/2018/august/data-points-deep-dive-into-ef-core-hasdata-seeding

所以,我的问题是

  1. 如果从一开始就创建并播种了数据库,并且一切正常,那么所有后续迁移都可以正常工作,而不会尝试再次为它们播种。

  2. 解决此问题的最佳方法是什么。

  3. 有什么我可能错过或未考虑的东西吗?

谢谢

西蒙

1 个答案:

答案 0 :(得分:0)

由于您不想丢失数据,因此可以考虑使用migrationBuilder.UpdateData()而不是migrationBuilder.InsertData()。 InserData方法将新记录添加到数据库中,而UpdateData将搜索并更新数据库中的现有记录。

确保您具有EF Core v2.1或更高版本,才能正常工作。