EF迁移:将索引字段更改为可空时出错

时间:2013-04-03 11:09:58

标签: entity-framework-5 ef-migrations

我初次迁移的代码如下

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

为了使Description字段唯一,我将以下内容添加到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 [描述] nvarchar NOT NULL

当我在Management Studio中运行它时,会出现以下错误

  

Msg 5074,Level 16,State 1,Line 1   索引“IX_Description”取决于“描述”列。   Msg 4922,Level 16,State 9,Line 1   ALTER TABLE ALTER COLUMN描述失败,因为一个或多个对象访问此列。

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

我正在使用SQL Server 2008 R2

1 个答案:

答案 0 :(得分: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 )");

如果要添加对索引存在的检查或其他内容,这可能很有用。