我使用EF6并编写首次迁移代码。我有两张桌子
public class Team {
public int Id { get; set; }
public string Name { get; set; }
}
public class TeamMember {
public int Id { get; set; }
public string Name { get; set; }
public Team Team { get; set; }
public int TeamId { get; set; }
}
我想将TeamMember重命名为TeamMemberDeprecated,并添加一个名为TeamMember的新表格,其中包含一些与表格布局的差异。我创建新表的主要原因是数据。我想保存当前TeamMember表中的所有数据,因此我需要重命名它,并且我只想将我需要的特定数据传输到新的TeamMember表。
当我添加迁移时,它看起来像这样
RenameTable(name: "dbo.TeamMember", newName: "TeamMemberDeprecated");
它没有做的是将外键属性的名称从FK_dbo.TeamMember_dbo.Team_TeamId更改为FK_dbo.TeamMemberDeprecated_dbo.Team_TeamId。
当我创建新的TeamMember表时出现问题,因为数据库中已存在外键FK_dbo.TeamMember_dbo.Team_TeamId。
我尝试删除外键并重命名它,但这并没有做任何事情,当我运行迁移-verbose时,我明白为什么它期望外键为空。我想保留数据,但也许我的方法是错误的。
欢迎任何建议,谢谢。
答案 0 :(得分:1)
让EF重命名表,然后转到SQL管理工作室并手动重命名外键。
返回EF,进行更改,运行迁移并让EF创建新的外键
别忘了备份你的数据库
答案 1 :(得分:0)
在 EF Core 5.??应该有一些新命令(参见 EFCore GitHub Pull):
但是,这些似乎会删除并重新创建密钥/约束。在 MSSQL 中,这不仅是不必要的,而且成本很高。当重新应用约束时,数据库会大量检查每个项目是否唯一或存在于外部表中。如果你能帮上忙,不要这样做。
相反,我推荐以下内容。您必须在新名称的第一个参数中指定架构,而不是在第二个参数中。如果任何疯子在表或约束名称中加了点,方括号会有所帮助:
$emit()
外键的作用相同:
migrationBuilder.Sql("sp_rename '[dbo].[PK_TeamMemberDeprecated]', '[PK_TeamMember]'");