8

我最初迁移的代码如下

        CreateTable(
            "dbo.Sites",
            c => new
                {
                    Id = c.Int(nullable: false, identity: true),
                    Description = c.String(maxLength: 450)
                })
            .PrimaryKey(t => t.Id);

为了使描述字段是唯一的,我在 UP 方法的末尾添加了以下内容

CreateIndex("dbo.Sites", "Description", unique: true);

后来我决定将描述字段设为必填。

新的迁移会产生以下变化

AlterColumn("dbo.Sites", "Description", c => c.String(nullable: false, maxLength: 450));

但是,当此更改尝试运行时,我收到错误

ALTER TABLE ALTER COLUMN 描述失败,因为一个或多个对象访问此列。

我能够使用分析器隔离 SQL 行,如

ALTER TABLE [dbo].[Sites] ALTER COLUMN [Description] nvarchar NOT NULL

当我在 Management Studio 中运行它时,这给了我以下错误

消息 5074,级别 16,状态 1,第 1 行索引“IX_Description”取决于“描述”列。消息 4922,级别 16,状态 9,第 1 行 ALTER TABLE ALTER COLUMN 描述失败,因为一个或多个对象访问此列。

如何获取迁移代码以删除索引,然后更改更改列,然后重新构建索引?

我正在使用 SQL Server 2008 R2

4

1 回答 1

10

大概是这样的?

DropIndex("dbo.Sites", "IX_Description");
AlterColumn("dbo.Sites", "Description", c => c.String(nullable: false, maxLength: 450));
CreateIndex("dbo.Sites", "Description", unique: true);

我认为您也可以直接执行 SQL,如下所示。

Sql("DROP INDEX [IX_Description] ON [dbo].[Sites] WITH ( ONLINE = OFF )");

如果您想添加检查索引是否存在或其他内容,这可能很有用。

于 2013-04-03T15:43:50.803 回答