Entity Framework 创建没有任何更新的迁移
Entity Framework creates migration without any updates
目前,我遇到了一个问题,我可以创建一个有数据更新的迁移,但是 DbContextModelSnapshot
有这个数据。当您查看迁移中的更新时,它们已经应用于 DbContextModelSnapshot
和数据库。
一位同事大约 3 个月前创建了一个迁移,一切都很好。从那时起,我们又创建了几次迁移,并且没有遇到过这个问题。然而,最近几天,我们一直在经历这种情况。
我们已尝试使用此数据更新创建迁移,并 运行将其固定。但是当我们创建另一个迁移时,该数据更新又出现了。 None 我们之前遇到过这个问题。
我们如何在不让这些数据不断出现的情况下创建迁移?我不确定与此相关的代码。
编辑:
创建的迁移具有数据 A(数据库中预先存在的数据和 DbContextModelSnapshot
)和数据 B(新数据),并且完全成功。也就是说,我的意思是数据 B 被添加到数据库并且 DbContextModelSnapshot
没有问题。但是,当我创建另一个迁移时,数据 A 再次出现。
编辑 2:
根据要求,我查看了我们拥有的所有迁移并与 __EFMigrationsHistory
进行了比较,它们都在那里。每次迁移都已 运行 成功。这已被至少 3 人验证。
编辑 3:
好的,问题是我如何为迁移指定数据。在模型 class 中,我们得到了 Configure()
。这是它,以及后续功能:
internal static void Configure(EntityTypeBuilder<PlayerType> entityTypeBuilder)
{
SetDefaultValues(entityTypeBuilder);
LoadSeedData(entityTypeBuilder);
}
private static void LoadSeedData(EntityTypeBuilder<PlayerType> entityTypeBuilder)
{
void AddPlayerType(int playerTypeId, string name, DateTime createdDate, DateTime? modifiedDate = null, bool isSystemDefault = true)
{
entityTypeBuilder
.HasData(
DbContextHelper.AssignBaseStats(
new List<PlayerType>
{
new PlayerType()
{
PlayerTypeId = playerTypeId,
Name = name,
IsSystemDefault = isSystemDefault
},
},
createdDate,
!modifiedDate.HasValue ? createdDate : modifiedDate.Value,
ApplicationConstants.SeedDataGenerationIdentifier,
false));
}
AddPlayerType(ApplicationConstants.TitleId, "Title", new DateTime(2020, 2, 11, 16, 27, 0, 0, DateTimeKind.Utc),
new DateTime(2020, 12, 19, 20, 11, 0, 0, DateTimeKind.Utc));
AddPlayerType(ApplicationConstants.BaseId, "Base", new DateTime(2020, 2, 11, 16, 27, 0, 0, DateTimeKind.Utc),
new DateTime(2020, 12, 19, 20, 11, 0, 0, DateTimeKind.Utc));
AddPlayerType(ApplicationConstants.QuizId, "Quiz", new DateTime(2020, 2, 11, 16, 27, 0, 0, DateTimeKind.Utc),
new DateTime(2020, 12, 19, 20, 11, 0, 0, DateTimeKind.Utc));
AddPlayerType(ApplicationConstants.ThreeDId, "ThreeDModel", new DateTime(2020, 2, 11, 16, 27, 0, 0, DateTimeKind.Utc),
new DateTime(2020, 12, 19, 20, 11, 0, 0, DateTimeKind.Utc), false);
AddPlayerType(ApplicationConstants.TestId, "Test", new DateTime(2020, 2, 11, 16, 27, 0, 0, DateTimeKind.Utc),
new DateTime(2020, 12, 19, 20, 11, 0, 0, DateTimeKind.Utc), false);
AddPlayerType(ApplicationConstants.ScoreId, "Score", new DateTime(2020, 3, 25, 21, 59, 0, 0, DateTimeKind.Utc),
new DateTime(2020, 12, 19, 20, 11, 0, 0, DateTimeKind.Utc));
AddPlayerType(ApplicationConstants.ExitId, "Exit", new DateTime(2020, 3, 25, 21, 59, 0, 0, DateTimeKind.Utc),
new DateTime(2020, 12, 19, 20, 11, 0, 0, DateTimeKind.Utc));
AddPlayerType(ApplicationConstants.WalkId, "Walkaround", new DateTime(2020, 10, 22, 14, 44, 0, 0, DateTimeKind.Utc),
new DateTime(2020, 12, 19, 20, 11, 0, 0, DateTimeKind.Utc), false);
}
private static void SetDefaultValues(EntityTypeBuilder<PlayerType> entityTypeBuilder)
{
entityTypeBuilder
.Property(thisTable => thisTable.IsSystemDefault)
.HasDefaultValue(false);
}
现在,这是在 12 月中旬更新的,之后的所有迁移都很好。但如前所述,最近的迁移已经开始具有以下内容:
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.UpdateData(
schema: "LessonDesigner",
table: "PlayerType",
keyColumn: "PlayerTypeId",
keyValue: 1,
column: "IsSystemDefault",
value: true);
migrationBuilder.UpdateData(
schema: "LessonDesigner",
table: "PlayerType",
keyColumn: "PlayerTypeId",
keyValue: 2,
column: "IsSystemDefault",
value: true);
migrationBuilder.UpdateData(
schema: "LessonDesigner",
table: "PlayerType",
keyColumn: "PlayerTypeId",
keyValue: 3,
column: "IsSystemDefault",
value: true);
migrationBuilder.UpdateData(
schema: "LessonDesigner",
table: "PlayerType",
keyColumn: "PlayerTypeId",
keyValue: 6,
column: "IsSystemDefault",
value: true);
migrationBuilder.UpdateData(
schema: "LessonDesigner",
table: "PlayerType",
keyColumn: "PlayerTypeId",
keyValue: 7,
column: "IsSystemDefault",
value: true);
}
编辑 4:
这是显示背靠背创建的迁移的屏幕截图。你可以看到,Up()
是相同的:
您似乎正在使用某些 EFC 3.1 版本(包括 3.1.9 在内),该版本存在错误 #21661 - Using ValueGeneratedOnAdd
on a property that is seeded causes UpdateData
calls in every subsequent migration, fixed in 3.1.10+ by #22760 - [release/3.1] 修复问题 属性 添加时生成的值在每次迁移中重新播种。
请注意,按照惯例,每个 属性 有 HasDefaultValue{Sql}
的 IsSystemDefault
都被视为 ValueGeneratedOnAdd
。
现在,要解决此问题,请升级到 EFC 3.10 或更高版本,或者对 ValueGeneratedNever
使用以下解决方法:
entityTypeBuilder
.Property(thisTable => thisTable.IsSystemDefault)
.HasDefaultValue(false)
.ValueGeneratedNever(); // <-- add this
目前,我遇到了一个问题,我可以创建一个有数据更新的迁移,但是 DbContextModelSnapshot
有这个数据。当您查看迁移中的更新时,它们已经应用于 DbContextModelSnapshot
和数据库。
一位同事大约 3 个月前创建了一个迁移,一切都很好。从那时起,我们又创建了几次迁移,并且没有遇到过这个问题。然而,最近几天,我们一直在经历这种情况。
我们已尝试使用此数据更新创建迁移,并 运行将其固定。但是当我们创建另一个迁移时,该数据更新又出现了。 None 我们之前遇到过这个问题。
我们如何在不让这些数据不断出现的情况下创建迁移?我不确定与此相关的代码。
编辑:
创建的迁移具有数据 A(数据库中预先存在的数据和 DbContextModelSnapshot
)和数据 B(新数据),并且完全成功。也就是说,我的意思是数据 B 被添加到数据库并且 DbContextModelSnapshot
没有问题。但是,当我创建另一个迁移时,数据 A 再次出现。
编辑 2:
根据要求,我查看了我们拥有的所有迁移并与 __EFMigrationsHistory
进行了比较,它们都在那里。每次迁移都已 运行 成功。这已被至少 3 人验证。
编辑 3:
好的,问题是我如何为迁移指定数据。在模型 class 中,我们得到了 Configure()
。这是它,以及后续功能:
internal static void Configure(EntityTypeBuilder<PlayerType> entityTypeBuilder)
{
SetDefaultValues(entityTypeBuilder);
LoadSeedData(entityTypeBuilder);
}
private static void LoadSeedData(EntityTypeBuilder<PlayerType> entityTypeBuilder)
{
void AddPlayerType(int playerTypeId, string name, DateTime createdDate, DateTime? modifiedDate = null, bool isSystemDefault = true)
{
entityTypeBuilder
.HasData(
DbContextHelper.AssignBaseStats(
new List<PlayerType>
{
new PlayerType()
{
PlayerTypeId = playerTypeId,
Name = name,
IsSystemDefault = isSystemDefault
},
},
createdDate,
!modifiedDate.HasValue ? createdDate : modifiedDate.Value,
ApplicationConstants.SeedDataGenerationIdentifier,
false));
}
AddPlayerType(ApplicationConstants.TitleId, "Title", new DateTime(2020, 2, 11, 16, 27, 0, 0, DateTimeKind.Utc),
new DateTime(2020, 12, 19, 20, 11, 0, 0, DateTimeKind.Utc));
AddPlayerType(ApplicationConstants.BaseId, "Base", new DateTime(2020, 2, 11, 16, 27, 0, 0, DateTimeKind.Utc),
new DateTime(2020, 12, 19, 20, 11, 0, 0, DateTimeKind.Utc));
AddPlayerType(ApplicationConstants.QuizId, "Quiz", new DateTime(2020, 2, 11, 16, 27, 0, 0, DateTimeKind.Utc),
new DateTime(2020, 12, 19, 20, 11, 0, 0, DateTimeKind.Utc));
AddPlayerType(ApplicationConstants.ThreeDId, "ThreeDModel", new DateTime(2020, 2, 11, 16, 27, 0, 0, DateTimeKind.Utc),
new DateTime(2020, 12, 19, 20, 11, 0, 0, DateTimeKind.Utc), false);
AddPlayerType(ApplicationConstants.TestId, "Test", new DateTime(2020, 2, 11, 16, 27, 0, 0, DateTimeKind.Utc),
new DateTime(2020, 12, 19, 20, 11, 0, 0, DateTimeKind.Utc), false);
AddPlayerType(ApplicationConstants.ScoreId, "Score", new DateTime(2020, 3, 25, 21, 59, 0, 0, DateTimeKind.Utc),
new DateTime(2020, 12, 19, 20, 11, 0, 0, DateTimeKind.Utc));
AddPlayerType(ApplicationConstants.ExitId, "Exit", new DateTime(2020, 3, 25, 21, 59, 0, 0, DateTimeKind.Utc),
new DateTime(2020, 12, 19, 20, 11, 0, 0, DateTimeKind.Utc));
AddPlayerType(ApplicationConstants.WalkId, "Walkaround", new DateTime(2020, 10, 22, 14, 44, 0, 0, DateTimeKind.Utc),
new DateTime(2020, 12, 19, 20, 11, 0, 0, DateTimeKind.Utc), false);
}
private static void SetDefaultValues(EntityTypeBuilder<PlayerType> entityTypeBuilder)
{
entityTypeBuilder
.Property(thisTable => thisTable.IsSystemDefault)
.HasDefaultValue(false);
}
现在,这是在 12 月中旬更新的,之后的所有迁移都很好。但如前所述,最近的迁移已经开始具有以下内容:
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.UpdateData(
schema: "LessonDesigner",
table: "PlayerType",
keyColumn: "PlayerTypeId",
keyValue: 1,
column: "IsSystemDefault",
value: true);
migrationBuilder.UpdateData(
schema: "LessonDesigner",
table: "PlayerType",
keyColumn: "PlayerTypeId",
keyValue: 2,
column: "IsSystemDefault",
value: true);
migrationBuilder.UpdateData(
schema: "LessonDesigner",
table: "PlayerType",
keyColumn: "PlayerTypeId",
keyValue: 3,
column: "IsSystemDefault",
value: true);
migrationBuilder.UpdateData(
schema: "LessonDesigner",
table: "PlayerType",
keyColumn: "PlayerTypeId",
keyValue: 6,
column: "IsSystemDefault",
value: true);
migrationBuilder.UpdateData(
schema: "LessonDesigner",
table: "PlayerType",
keyColumn: "PlayerTypeId",
keyValue: 7,
column: "IsSystemDefault",
value: true);
}
编辑 4:
这是显示背靠背创建的迁移的屏幕截图。你可以看到,Up()
是相同的:
您似乎正在使用某些 EFC 3.1 版本(包括 3.1.9 在内),该版本存在错误 #21661 - Using ValueGeneratedOnAdd
on a property that is seeded causes UpdateData
calls in every subsequent migration, fixed in 3.1.10+ by #22760 - [release/3.1] 修复问题 属性 添加时生成的值在每次迁移中重新播种。
请注意,按照惯例,每个 属性 有 HasDefaultValue{Sql}
的 IsSystemDefault
都被视为 ValueGeneratedOnAdd
。
现在,要解决此问题,请升级到 EFC 3.10 或更高版本,或者对 ValueGeneratedNever
使用以下解决方法:
entityTypeBuilder
.Property(thisTable => thisTable.IsSystemDefault)
.HasDefaultValue(false)
.ValueGeneratedNever(); // <-- add this