【发布时间】:2021-04-19 11:30:33
【问题描述】:
我有一个非常简单的场景,其中我有许多相关实体,其中一些预计会被预填充(通过种子脚本)。然后,我运行我的应用程序,它添加了一个新的相关数据(与种子脚本填充的表相关)。
最终,当我想添加一个新的迁移时,例如使一个字段可以为空(一个未播种的实体),我尝试了 update-database 命令并且一切都崩溃了,因为迁移试图重新创建我的种子表。这是不可能的,因为他们保留了外键。
我会更具体:
汽车(ID、品牌、颜色、年份)
多对一
CarType(ID、值)
所以,在我的 DbContext 中,我有以下内容:
modelBuilder.Entity<CarType>()
.HasData(new CarType('4125ad9e-68fe-4d25-9d73-7e8acc097d6f', 'Coupe'))
然后,我运行我的应用程序并开始插入具有相应类型的新 Cars。所以,现在我有:
Car(1, 'BMW', 'Black', 2011) FK-> CarType('4125ad9e-68fe-4d25-9d73-7e8acc097d6f', 'Coupe')
Car(2, 'Audi', 'Green', 2008) FK-> CarType('cc097d6f9e-68fe-4d25-9d73-4125ad7e8a', 'Estate')
但是,有一天我决定让Year 字段可以为空
public int? Year { get; set; }
我跑了add-migration,一切看起来都很好,除了Up语句中的那个:
migrationBuilder.DeleteData(
table: "CarType",
keyColumn: "Id",
keyValue: new Guid("4125ad9e-68fe-4d25-9d73-7e8acc097d6f"));
一旦我执行update-database,我就会收到一个错误,指出该操作无法执行,因为有一个与我要删除的实体相关的外键:
DELETE 语句与 REFERENCE 约束冲突
我应该如何处理?我的种子票现在有点挡住我了。我希望能够对我的其他表进行更改,即使是在不需要重新创建内容的情况下使用种子脚本编写的表。
【问题讨论】:
-
@GertArnold 已更正。谢谢。