EF核心-种子数据-违反PK

时间:2020-05-14 07:07:19

标签: c# seeding ef-core-3.1

我在一家公司内部进行项目工作,因为构建系统的外部团队任务做得不好,因此被解雇了。

我遇到的一个问题是,我们有一个现有的数据库,其中应该通过migrationBuilder完成种子数据的某些表似乎只是通过SSMS \ SQL Server插入脚本插入的。

结果是,在添加种子脚本时出现了这样的错误,因此当我们启动数据库的一个新的实例时,它可以工作,但是在现有环境(如dev,test和暂存)上却不起作用。

违反主键约束“ PK_xxxx”。无法在对象“ forms.AnswerTypes”中插入重复键。重复的键值为(1)

我发现的唯一可能的方法是从此处的链接

https://entityframeworkcore.com/knowledge-base/54553668/add-or-update-data-to-existing-database-with-entity-framework

但是希望有更好的方法可以实现此目标,因为我不能删除数据作为迁移的一部分,因为它已经被其他表引用并已被其他表使用,因此波动影响范围很广。

我尝试播种的数据类型的示例如下:

protected override void Up(MigrationBuilder migrationBuilder)
{
    migrationBuilder.InsertData(
        schema: "forms",
        table: "Rules",
        columns: new[] { "RuleId", "Rules" },
        values: new object[] { 1, "Any" });

    migrationBuilder.InsertData(
        schema: "forms",
        table: "Rules",
        columns: new[] { "RuleId", "Rules" },
        values: new object[] { 2, "All" });
}

所以问题是,是否可以使用migrationBuilder在插入之前检查数据是否存在?

1 个答案:

答案 0 :(得分:1)

您可以编写自定义SQL和内容并将其添加到迁移脚本中;

https://docs.microsoft.com/en-us/ef/core/managing-schemas/migrations/operations

还有.Sql()

https://docs.microsoft.com/en-us/ef/core/managing-schemas/migrations/?tabs=dotnet-core-cli#customize-migration-code

migrationBuilder.Sql(
@"
    UPDATE Customer
    SET Name = FirstName + ' ' + LastName;
");

您可以使用哪个。我的团队和我仍然使用EF6,但我们使用相同的原理。我们的迁移脚本有时还具有其他SQL语句,以在添加列等时移动任何数据或生成默认数据。