2013-04-03 43 views
7

的代碼在我最初的移民是如下EF遷移:錯誤更改索引字段可空

 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」, 「描述」 中,c => c.String(可爲空的:假的,最大長度:450));

然而,當這種變化嘗試運行我得到一個錯誤

ALTER TABLE ALTER COLUMN說明失敗,因爲一個或多個對象訪問此列。

我能夠使用分析器的SQL線隔離,如

ALTER TABLE [DBO]。[站點] ALTER COLUMN [說明]爲nvarchar NOT NULL

其中給出我在管理工作室中運行時出現以下錯誤

消息5074級別16狀態1行1 索引' IX_Description'依賴於'Description'列。 消息4922,級別16,狀態9,行1 ALTER TABLE ALTER COLUMN說明失敗,因爲一個或多個對象訪問此列。

如何獲得遷移代碼以刪除索引,然後更改alter column然後重新構建索引?

我正在使用SQL Server 2008 R2

+0

使用帶有空列的唯一索引很奇怪。空值是任何其他值,所以只有一條記錄將能夠具有空值,否則您將收到唯一的約束違規。 –

+0

雖然NULL!= NULL,但不要以爲我最近自己嘗試過 - 值得檢查一下。 – Mark

+0

我希望空白是組合框中的有效選項。我應該有空還是空字符串? –

回答

8

也許這樣的事情?

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

我想你也可以像下面那樣執行SQL direct。

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

如果你想添加一個檢查索引是否存在的東西,這會很有用。

+0

謝謝,你的回答有效。但是,如果索引尚不存在,SQL替代將失敗。 –

+1

是的,你需要有一個IF EXISTS語句,如果你想堅強。就我個人而言,我會從SQL管理工作室生成拖放腳本,並將其粘貼,因爲通常包含該檢查。 – Mark

+0

我從管理工作室生成時看不到支票。我是否正確地做這件事?右鍵單擊索引和腳本索引下拉到...我看到創建腳本中的設置。 DROP_EXISTING –