8

私の最初の移行のコードは次のとおりです

        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 説明は、1 つ以上のオブジェクトがこの列にアクセスしているため失敗しました。

プロファイラーを使用して SQL 行を分離することができました。

ALTER TABLE [dbo].[Sites] ALTER COLUMN [説明] nvarchar NOT NULL

Management Studioで実行すると、次のエラーが表示されます

メッセージ 5074、レベル 16、状態 1、行 1 インデックス 'IX_Description' は列 'Description' に依存しています。メッセージ 4922、レベル 16、状態 9、行 1 ALTER TABLE ALTER COLUMN 説明は、1 つ以上のオブジェクトがこの列にアクセスしているため失敗しました。

移行コードでインデックスを削除し、列を変更してからインデックスを再構築するにはどうすればよいですか?

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 に答える