EF Core将实体类重命名视为删除旧实体并添加新实体,因此会生成一个迁移来删除原始表并创建一个新表。
解决方法需要执行以下步骤:
(1) 在重命名实体之前,使用ToTable
和HasColumnName
流畅API或数据注释来“重命名”表格和PK列。同时也要对引用该实体的FK列执行相同操作。
例如:
[Table("StudentSurveys")]
public class Survey
{
[Column("StudentSurveyId")]
public int SurveyId { get; set; }
public string Name { get; set; }
}
public class User
{
public int UserId { get; set; }
[Column("StudentSurveyId")]
public int SurveyId { get; set; }
public Survey Survey { get; set; }
}
(2) 添加新迁移。它将正确重命名表、PK列、FK列和相关约束条件:
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropForeignKey(
name: "FK_Users_Surveys_SurveyId",
table: "Users");
migrationBuilder.DropPrimaryKey(
name: "PK_Surveys",
table: "Surveys");
migrationBuilder.RenameTable(
name: "Surveys",
newName: "StudentSurveys");
migrationBuilder.RenameColumn(
name: "SurveyId",
table: "Users",
newName: "StudentSurveyId");
migrationBuilder.RenameIndex(
name: "IX_Users_SurveyId",
table: "Users",
newName: "IX_Users_StudentSurveyId");
migrationBuilder.RenameColumn(
name: "SurveyId",
table: "StudentSurveys",
newName: "StudentSurveyId");
migrationBuilder.AddPrimaryKey(
name: "PK_StudentSurveys",
table: "StudentSurveys",
column: "StudentSurveyId");
migrationBuilder.AddForeignKey(
name: "FK_Users_StudentSurveys_StudentSurveyId",
table: "Users",
column: "StudentSurveyId",
principalTable: "StudentSurveys",
principalColumn: "StudentSurveyId",
onDelete: ReferentialAction.Cascade);
}
(3) 删除注释 / 流畅配置并进行实际的类/属性重命名:
public class StudentSurvey
{
public int StudentSurveyId { get; set; }
public string Name { get; set; }
}
public class User
{
public int SurveyUserId { get; set; }
public int StudentSurveyId { get; set; }
public StudentSurvey StudentSurvey { get; set; }
}
如果有的话,请重命名相应的DbSet
:
public DbSet<StudentSurvey> StudentSurveys { get; set; }
完成了。
您可以通过添加新迁移来验证 - 它将具有空的 Up
和 Down
方法。
[Column("StudentSurveyId")]
。我会尝试一下... - egmfrspublic DbSet<StudentSurvey> Surveys { get; set; }
需要变成public DbSet<StudentSurvey> StudentSurveys { get; set; }
,然后我遇到了同样的问题。因为StudentSurveys需要变成StudentSurvey。事后看来,我应该在我的第一个注释中将[Table(StudentSurvey)]
复数化。我建议更新你的答案考虑到所有这些。 - egmfrsDbSet
重命名是“重命名”操作的一部分。无论如何,答案现在已经更新了,我有遗漏什么吗? - Ivan Stoev