取决于您使用的 EF 版本。即使使用迁移,您将看到的结果类似于:
“删除列 ID”和“添加列 TeamId”。
有了这个,你将失去所有的价值观和“子联系”......
我此时看到的唯一“安全”解决方案是迁移和“手动 SQL 操作”的混合。
简单的解决方案:
1-考虑到您已经有一个“基本”迁移创建带有 ID 的表,现在使用“更新”创建新迁移。现在不要运行它。
2- 打开该文件并在生成的行之前写一个新行并使用 SQL 命令,如下所示:
SQL("ALTER TABLE table_name RENAME COLUMN old_name to new_name;");
这将在迁移删除列并创建一个新列之前更改名称,将会发生的情况是:您在删除之前更改名称,然后执行删除,但它会“失败”,但不会造成任何伤害。
但现在你问:我为什么要这样做?好吧,如果您正在使用迁移,即使您删除行以删除列并创建一个新行,下次您自动创建一个新的迁移文件时,这些新行也会在那里......这就是原因。
更新答案#1
当我谈论实体框架迁移时,我指的是:http:
//blogs.msdn.com/b/adonet/archive/2012/02/09/ef-4-3-code-based-migrations-walkthrough.aspx
当您在包管理器控制台中运行“Add-Migration AddBlogUrl”命令时,会创建一个新文件 (*.cs)。
此文件迁移文件与 SQL 命令的示例:
public partial class AddAbsencesTypesAndCategories : DbMigration
{
public override void Up()
{
CreateTable(
"pvw_AbsenceType",
c => new
{
Id = c.Int(nullable: false, identity: true),
Name = c.String(nullable: false),
CountAsVacation = c.Boolean(nullable: false),
IsIncremental = c.Boolean(nullable: false),
})
.PrimaryKey(t => t.Id);
.....
AddColumn("pvw_Absence", "CategoryId", c => c.Int(nullable: false));
AddForeignKey("pvw_Absence", "StatusId", "pvw_AbsenceStatusType", "Id");
AddForeignKey("pvw_Absence", "CategoryId", "pvw_AbsenceType", "Id");
CreateIndex("pvw_Absence", "StatusId");
CreateIndex("pvw_Absence", "CategoryId");
DropColumn("pvw_Absence", "MainCategoryId");
DropColumn("pvw_Absence", "SubCategoryId");
......
Sql(@"
SET IDENTITY_INSERT [dbo].[pvw_AbsenceStatusType] ON
INSERT pvw_AbsenceStatusType (Id, Name) VALUES (1, N'Entwurf')
SET IDENTITY_INSERT [dbo].[pvw_AbsenceStatusType] OFF
");
.....
}
public override void Down()
{
........
}