2013-04-03 1 views
7

コードをNULL値可能にするインデックスフィールドを変更するエラーだった私は、の最後に次を追加しましたUPメソッドEFの移行:説明フィールドが一意になるように</p> <blockquote> <pre><code> CreateTable( "dbo.Sites", c => new { Id = c.Int(nullable: false, identity: true), Description = c.String(maxLength: 450) }) .PrimaryKey(t => t.Id); </code></pre> </blockquote> <p>を次のように私の最初の移行に

CreateIndex( "dbo.Sites"、 "説明"、一意:true);

後で説明フィールドを必須にすることにしました。

新たなマイグレーションは、以下の変更

AlterColumn( "dbo.Sites"、 "説明"、C => c.String(NULL可能:偽、maxLengthの:450))を生成します。この変更は、私はエラーを取得する実行しようとしたときに

しかし

ALTER TABLE ALTER COLUMNの説明は、1つまたは複数のオブジェクトがこの列にアクセスするために失敗しました。

ALTER TABLE [DBO]。[サイト]を与える

[解説] nvarchar型のNOT NULL列を変更として、私は、プロファイラを使用してSQLラインを分離することができました管理スタジオで実行すると次のエラーが発生する

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

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

私はおそらく、このようなR2が

+0

null可能な列で一意のインデックスを使用するのが奇妙です。 Nullは他の値と同じ値ですので、1つのレコードだけがNull値を持つことができます。そうでなければ、ユニークな制約違反が発生します。 –

+0

私はNULLだが!= NULLでも、私は最近それを試したとは思わない - それをチェックする価値がある。 – Mark

+0

コンボボックスでは空白を有効なオプションにします。私はそれに対してヌルか空文字列を持っているべきですか? –

答えて

8

何かSQL Server 2008を使用していますか?

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)"); 

インデックスが存在するかどうかをチェックしたい場合に便利です。

+0

お返事ありがとうございます。ただし、索引がまだ存在しない場合は、SQLの代替方法が失敗します。 –

+1

堅牢性が必要な場合は、IF EXISTSステートメントが必要です。個人的には、私はSQL管理スタジオからドロップスクリプトを生成し、通常はそのチェックを含むように貼り付けます。 – Mark

+0

私はマネージメントスタジオから生成するときにチェックが表示されません。私はそれを正しい方法でやっていますか?インデックスとスクリプトインデックスを右クリックします。ドロップ先...作成スクリプトに設定が表示されます。 DROP_EXISTING –

関連する問題

 関連する問題