更改迁移文件的表后,如何更新数据库?

时间:2015-04-03 22:43:05

标签: asp.net-mvc entity-framework ef-code-first clustered-index ef-migrations

我有我的初始迁移文件,其中包含所有实体表,并且数据库已更新并包含所有表。 现在我想改变一个表并将聚簇索引从主键更改为另一个索引。代码修改如下所示。 我在这里进行了两处小改动,为主键设置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"迁移文件中的语句。使用迁移文件中的更改来更新数据库的步骤是什么?我是否需要仅使用更改创建另一个迁移文件?

2 个答案:

答案 0 :(得分:0)

您过高估计了迁移机制。它的目的是管理连续迁移之间的数据库转换,在迁移代码中识别您的更改并不够聪明。通常,要更改数据库结构,您必须使用代码更改表,列,索引等来生成新的迁移,以匹配新结构。使用IndexAttribute(版本6.1),您可以在DateTimeScheduled上定义要聚类的索引,EF将自动识别该模型已更改,当您使用add-migration时,它将生成为您改变YogaSpaceEvents的迁移。

如果您坚持不想进行单独迁移,但更改应包含在当前迁移中,您有2个选项:

  1. 将您的数据库迁移到以前的迁移,使用" add-migration -Force"重新生成当前迁移以匹配您的更改,然后将迁移应用于您的数据库
  2. 使用" add-migration"添加将更改应用于db的新迁移。然后将数据库迁移到最新状态。之后删除新添加的迁移文件,使用" add-migration -Force"应用于某个测试数据库时,重新生成初始迁移,以便将对模型的更改合并到其中。最后要做的是在数据库__MigrationsHistory表中删除与您删除的迁移相对应的行并更新" Model" thr行的字段值对应于初始迁移到" Model"的值。与删除的迁移相对应的行中的字段。
  3. 在您的情况下,可能1)选项在您更改第一次迁移时不会起作用,因此恢复它会导致删除所有数据库结构和所有数据库数据。但是,如果您的数据库仍然不包含任何重要数据,这更容易。如果要保留数据并且只有1次迁移,则必须使用路径2)。

答案 1 :(得分:0)

您无法编辑现有迁移并将其应用而不更新到该迁移,然后重新更新回到最新版本。这样,您运行所有Down()脚本,删除表。

或者,您构建一个新的迁移并明确执行Up()中所需的操作,并在Down()中反转它们。