EF Core - 种子数据 - PK 违规
EF Core - Seed Data - PK Violation
我在一家公司工作,一个项目被引入内部,因为构建系统的外部团队任务做得不好,因此被解雇了。
我遇到的一个问题是我们有一个现有的数据库,其中一些应该通过 migrationBuilder
完成种子数据的表看起来刚刚通过 SSMS \ SQL 服务器插入插入脚本。
因此,我在添加播种脚本时遇到了这样的错误,因此当我们启动一个新的数据库实例时,它会起作用,但在现有环境(例如开发、测试和暂存)中却不起作用。
Violation of PRIMARY KEY constraint 'PK_xxxx'. Cannot insert duplicate key in object 'forms.AnswerTypes'. The duplicate key value is (1)
我找到的唯一可能的解决方法是 link 这里
但希望有更好的方法可以实现这一点,因为我无法在迁移过程中删除数据,因为它已经被使用并被其他表引用,因此连锁反应范围很广。
我尝试播种的数据类型示例如下;
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 是否可以在插入之前检查数据是否存在?
您可以编写自定义 SQL 之类的东西并将其添加到您的迁移脚本中;
https://docs.microsoft.com/en-us/ef/core/managing-schemas/migrations/operations
还有.Sql()
:
migrationBuilder.Sql(
@"
UPDATE Customer
SET Name = FirstName + ' ' + LastName;
");
你可以使用。我和我的团队仍在使用 EF6,但我们使用相同的原则。我们的迁移脚本有时会有额外的 SQL 语句来移动任何数据或在添加列等时生成默认数据。
我在一家公司工作,一个项目被引入内部,因为构建系统的外部团队任务做得不好,因此被解雇了。
我遇到的一个问题是我们有一个现有的数据库,其中一些应该通过 migrationBuilder
完成种子数据的表看起来刚刚通过 SSMS \ SQL 服务器插入插入脚本。
因此,我在添加播种脚本时遇到了这样的错误,因此当我们启动一个新的数据库实例时,它会起作用,但在现有环境(例如开发、测试和暂存)中却不起作用。
Violation of PRIMARY KEY constraint 'PK_xxxx'. Cannot insert duplicate key in object 'forms.AnswerTypes'. The duplicate key value is (1)
我找到的唯一可能的解决方法是 link 这里
但希望有更好的方法可以实现这一点,因为我无法在迁移过程中删除数据,因为它已经被使用并被其他表引用,因此连锁反应范围很广。
我尝试播种的数据类型示例如下;
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 是否可以在插入之前检查数据是否存在?
您可以编写自定义 SQL 之类的东西并将其添加到您的迁移脚本中;
https://docs.microsoft.com/en-us/ef/core/managing-schemas/migrations/operations
还有.Sql()
:
migrationBuilder.Sql(
@"
UPDATE Customer
SET Name = FirstName + ' ' + LastName;
");
你可以使用。我和我的团队仍在使用 EF6,但我们使用相同的原则。我们的迁移脚本有时会有额外的 SQL 语句来移动任何数据或在添加列等时生成默认数据。