2013-04-03 4 views
7

Il codice nel mio migrazione iniziale è stato il seguenteEF migrazione: Errore durante il cambiamento un campo indicizzato al annullabile

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

modo che il campo Descrizione sarebbe unico ho aggiunto quanto segue alla fine del UP metodo

CreateIndex ("dbo.Sites", "Descrizione", univoco: true);

Successivamente ho deciso di rendere obbligatorio il campo Descrizione.

La nuova migrazione genera il seguente modifica

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

Tuttavia quando questo cambiamento tenta di eseguire ottengo un errore

ALTER TABLE ALTER COLUMN Descrizione riuscita perché uno o più oggetti accedono a questa colonna.

sono stato in grado di isolare la linea di SQL utilizzando il profiler, come

ALTER TABLE [dbo]. [Siti] ALTER colonna [Descrizione] nvarchar NOT NULL

che dà me il seguente errore quando l'eseguo in Management Studio

Msg 5074, livello 16, stato 1, riga 1 l'indice ' IX_Descrizione 'dipende dalla colonna' Descrizione '. messaggio 4922, livello 16, stato 9, riga 1 ALTER TABLE ALTER COLUMN Descrizione non riuscita perché uno o più oggetti accedono a questa colonna.

Come posso ottenere il codice di migrazione per eliminare l'indice, quindi modificare modificare la colonna e quindi ricostruire l'indice?

Sto usando SQL Server 2008 R2

+0

L'utilizzo dell'indice univoco con colonna nullable è strano. Null ha valore come qualsiasi altro, quindi solo un record UNO sarà in grado di avere un valore Null altrimenti riceverai una violazione del vincolo univoco. –

+0

I though NULL! = NULL ma non penso di averlo provato da solo di recente - ne vale la pena controllare. – Mark

+0

Voglio vuoto per essere un'opzione valida nella casella combinata. Dovrei avere Null o una stringa vuota per quello? –

risposta

8

Qualcosa di simile, forse?

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

Penso che si può anche eseguire SQL diretto, come di seguito.

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

Quale può essere utile se si desidera aggiungere un controllo l'indice esiste o qualcosa del genere.

+0

Grazie, la tua risposta funziona. Tuttavia l'alternativa SQL non riesce se l'indice non è già presente. –

+1

Sì, avresti bisogno di avere un'istruzione IF EXISTS se volessi quella robustezza. Personalmente avrei generato lo script di rilascio da SQL Management Studio e incollato quello in quanto normalmente include quel controllo. – Mark

+0

Non vedo il controllo quando creo da studio di gestione. Lo sto facendo nel modo giusto? fare clic con il tasto destro sull'indice e l'indice dell'indice Drop To ... Vedo un'impostazione nello script di creazione. DROP_EXISTING –