2013-04-03 4 views
7

kodu w moim początkowym migracji był następującyEF migracja: Błąd zmianę pola indeksowanego do pustych

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

więc, że pole Opis byłby wyjątkowy I dodaje następujące do końca Metoda UP

CreateIndex ("dbo.Sites", "Description", unique: true);

Później postanowiłem wprowadzić pole Opis.

nowej migracji generuje następstwie zmian

AlterColumn ("dbo.Sites", "Opis", c => c.String (pustych false, MAXLENGTH 450));

Jednak gdy zmiana ta próbuje uruchomić pojawia się błąd

ALTER TABLE ALTER COLUMN Opis powiodła się, ponieważ jeden lub więcej obiektów dostęp do tej kolumny.

udało mi się wyizolować linię SQL za pomocą profilera, jak

ALTER TABLE [dbo]. [Kultu] ALTER COLUMN [Opis] nvarchar NOT NULL

Który daje mi następujący błąd po uruchomieniu go w Studio Zarządzania

Msg 5074, Poziom 16, Stan 1, Linia 1 Indeks " IX_Opis "zależy od kolumny" Opis ". Msg 4922, Poziom 16, Stan 9, Wiersz 1 ALTER TABLE ALTER COLUMN Opis nie powiodło się, ponieważ jeden lub więcej obiektów ma dostęp do tej kolumny.

Jak mogę usunąć kod migracyjny z indeksu, a następnie zmienić kolumnę, a następnie ponownie zbudować indeks?

Używam programu SQL Server 2008 R2

+0

Używanie unikalnego indeksu z kolumną zerowalną jest dziwne. Wartość Null jest taka, jak każda inna, więc tylko JEDEN rekord będzie miał wartość Null, w przeciwnym razie otrzymasz wyjątkowe naruszenie ograniczenia. –

+0

Chociaż NULL! = NULL, ale nie sądzę, że ostatnio wypróbowałem go sam - warto to sprawdzić. – Mark

+0

Chcę, aby puste było poprawną opcją w polu kombi. Czy powinienem mieć wartość Null lub pusty ciąg znaków? –

Odpowiedz

8

Coś takiego może być?

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

Myślę, że można również wykonać SQL Direct jak poniżej.

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

Co może być przydatne, jeśli chcesz dodać sprawdzenie, czy istnieje indeks lub coś podobnego.

+0

Dzięki, twoja odpowiedź działa. Jednak alternatywa SQL nie powiedzie się, jeśli indeks nie jest już obecny. –

+1

Tak, musisz mieć instrukcję IF EXISTS, jeśli chcesz taką solidność. Osobiście wygenerowałbym skrypt upuszczania ze studia zarządzania SQL i wkleiłem go w taki sposób, w jaki normalnie obejmuje to sprawdzenie. – Mark

+0

Nie widzę czeku, kiedy generuję ze studia zarządzania. Czy robię to we właściwy sposób? kliknij prawym przyciskiem myszy indeks i indeks skryptu Przejdź do ... Widzę ustawienie w skrypcie tworzenia. DROP_EXISTING –