我正在使用一个现有项目,该项目具有一个数据库,其中包含通过SQL Server \ SSMS手动创建的数据。
在项目的其他部分,其他人来了并创建了种子数据\配置文件。这是我被引入解决方案并创建新迁移文件的地方,发现我收到错误:
PRIMARY KEY约束'PK_AnswerTypes'。无法在对象“ forms.AnswerTypes”中插入重复键。重复的键值为(1)
通过Azure管道查看,自创建配置文件以来,这似乎是一个问题。
配置代码为
public void Configure(EntityTypeBuilder<FieldType> builder)
{
if (builder == null)
{
throw new ArgumentNullException(nameof(builder));
}
builder.ToTable("FieldTypes", FormEngineSchemas.Forms);
// TODO: convert to enum
builder.HasData(
new FieldType
{
FieldTypeId = 1,
FieldTypes = "NUMBER"
},
new FieldType
{
FieldTypeId = 2,
FieldTypes = "DROPDOWN"
},
new FieldType
{
FieldTypeId = 3,
FieldTypes = "DATE"
});
}
上标是
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.InsertData(
schema: "forms",
table: "AnswerTypes",
columns: new[] { "AnswerTypeId", "AnswerTypes" },
values: new object[,]
{
{ 1, "Range" },
{ 2, "Length" },
{ 3, "regex" }
});
}
如果有人可以帮助建议我如何通过此方法,我将不胜感激,因为我不想删除潜在的孤立记录或删除失败的风险,因此不必删除数据库中的现有数据。
我看了一眼,这是我所看到的最接近的问题
https://github.com/dotnet/efcore/issues/12324
在这里看起来播种已正确完成
https://www.learnentityframeworkcore.com/migrations/seeding
所以,我的问题是
如果从一开始就创建并播种了数据库,并且一切正常,那么所有后续迁移都可以正常工作,而不会尝试再次为它们播种。
解决此问题的最佳方法是什么。
有什么我可能错过或未考虑的东西吗?
谢谢
西蒙
答案 0 :(得分:0)
由于您不想丢失数据,因此可以考虑使用migrationBuilder.UpdateData()
而不是migrationBuilder.InsertData()
。 InserData方法将新记录添加到数据库中,而UpdateData将搜索并更新数据库中的现有记录。
确保您具有EF Core v2.1或更高版本,才能正常工作。