【问题标题】:EF Core - Seed Data - PK ViolationEF Core - 种子数据 - PK 违规
【发布时间】:2020-08-30 15:06:12
【问题描述】:

我在一家公司工作,其中一个项目已被引入内部,因为构建系统的外部团队任务没有做得很好,因此被解雇了。

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

因此,我在添加播种脚本时收到类似这样的错误,因此当我们启动数据库的新实例时,它可以工作,但在现有环境(如开发、测试和登台)上却不行。

违反主键约束“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 是否可以在插入之前检查数据是否存在?

【问题讨论】:

    标签: c# seeding ef-core-3.1


    【解决方案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 语句来移动任何数据或在添加列等时生成默认数据。

    【讨论】:

    • 这就是我根据问题中的链接所做的。希望我们将首先远离代码,因此不会很快成为问题。
    猜你喜欢
    • 2020-08-27
    • 2020-12-13
    • 2021-04-26
    • 2017-06-23
    • 2022-07-04
    • 1970-01-01
    • 2019-02-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多