我有我的初始迁移文件,其中包含所有实体表,并且数据库已更新并包含所有表。 现在我想改变一个表并将聚簇索引从主键更改为另一个索引。代码修改如下所示。 我在这里进行了两处小改动,为主键设置clustered为false,为另一个索引设置true。不确定这是否有效,因为现在我在尝试更新数据库时遇到错误。
CreateTable(
"dbo.YogaSpaceEvents",
c => new
{
YogaSpaceEventId = c.Int(nullable: false, identity: true),
Title = c.String(),
DateTimeScheduled = c.DateTime(nullable: false),
AppointmentLength = c.Int(nullable: false),
StatusEnum = c.Int(nullable: false),
YogaSpaceRefId = c.Int(nullable: false),
})
.PrimaryKey(t => t.YogaSpaceEventId, clustered: false)
.ForeignKey("dbo.YogaSpaces", t => t.YogaSpaceRefId, cascadeDelete: true)
.Index(t => t.DateTimeScheduled, clustered: true)
.Index(t => t.YogaSpaceRefId);
如果我运行update-database,我会收到一条错误消息"实体' blahblah'已经存在于数据库中#34;它来自第一个" CrateTable"迁移文件中的语句。使用迁移文件中的更改来更新数据库的步骤是什么?我是否需要仅使用更改创建另一个迁移文件?
答案 0 :(得分:0)
您过高估计了迁移机制。它的目的是管理连续迁移之间的数据库转换,在迁移代码中识别您的更改并不够聪明。通常,要更改数据库结构,您必须使用代码更改表,列,索引等来生成新的迁移,以匹配新结构。使用IndexAttribute(版本6.1),您可以在DateTimeScheduled上定义要聚类的索引,EF将自动识别该模型已更改,当您使用add-migration时,它将生成为您改变YogaSpaceEvents的迁移。
如果您坚持不想进行单独迁移,但更改应包含在当前迁移中,您有2个选项:
在您的情况下,可能1)选项在您更改第一次迁移时不会起作用,因此恢复它会导致删除所有数据库结构和所有数据库数据。但是,如果您的数据库仍然不包含任何重要数据,这更容易。如果要保留数据并且只有1次迁移,则必须使用路径2)。
答案 1 :(得分:0)
您无法编辑现有迁移并将其应用而不更新到该迁移,然后重新更新回到最新版本。这样,您运行所有Down()
脚本,删除表。
或者,您构建一个新的迁移并明确执行Up()
中所需的操作,并在Down()
中反转它们。