c# - EF Core - 种子数据 - PK 违规
问题描述
我在一家公司工作,其中一个项目已被引入内部,因为构建系统的外部团队任务没有做得很好,因此被解雇了。
我遇到的一个问题是我们有一个现有的数据库,其中一些应该通过migrationBuilder
看起来刚刚通过 SSMS\SQL Server 插入脚本插入的种子数据的表。
结果,我在添加种子脚本时遇到这样的错误,因此当我们启动数据库的新实例时,它可以工作,但在现有环境(如开发、测试和登台)上却不行。
违反主键约束“PK_xxxx”。无法在对象“forms.AnswerTypes”中插入重复键。重复键值为 (1)
我发现的唯一可能的方法是来自这里的链接
但是希望有更好的方法可以实现这一点,因为我无法在迁移过程中删除数据,因为它已经被其他表使用并被其他表引用,因此连锁反应范围很广。
我试图播种的数据类型的一个例子是这样的;
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 语句来移动任何数据或在添加列等时生成默认数据。
推荐阅读
- android - 如何在 Listview android 中显示 sharepreferences 项
- utf-8 - 这些奇怪的 UTF 字符是如何在 Twitter 评论中卡在一起的?
- node.js - 在不停机的情况下扩展 Node.js Express 服务器 Pod 的 Kubernetes 部署
- ios - 助理编辑器锁定在 Xcode
- c++ - C++输入整数打印unicode
- python - 无法破译此 Python 代码
- javascript - 如何在Javascript中的类函数中维护对类变量的引用
- sql - 如何从具有一对多关系的表中随机选择?
- firebase - 在颤振中如何将列表保存到firebase
- linux - 放大稀疏文件