2013-04-03 5 views
7

Der Code in meiner ersten Migration auf NULL festlegbare war wie folgtEF Migration: Fehler ein indiziertes Feld Ändern

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

Damit das Feld Beschreibung eindeutig sein würde ich addierten die folgenden bis zum Ende des UP-Methode

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

Später habe ich mich entschieden, das Feld Beschreibung erforderlich zu machen.

Die neue Migration erzeugt die folgende Änderung

AlterColumn ("dbo.Sites", "Beschreibung", c => c.String (NULL festlegbaren: false, maxLength: 450));

jedoch, wenn diese Änderung ich einen Fehler zu laufen versucht

ALTER TABLE ALTER COLUMN Beschreibung schlug fehl, weil ein oder mehrere Objekte in dieser Spalte zugreifen.

konnte ich die SQL-Linie mit dem Profiler isolieren, wie

ALTER TABLE [dbo]. [Sites] COLUMN ALTE [Beschreibung] nvarchar NOT NULL

Welche gibt mir den folgenden Fehler, wenn ich es in Management Studio ausführen

Msg 5074, Ebene 16, Zustand 1, Linie 1 Der Index ' IX_Description 'ist abhängig von der Spalte' Description '. Msg 4922, Ebene 16, Status 9, Zeile 1 ALTER TABLE ALTER COLUMN Beschreibung fehlgeschlagen, da ein oder mehrere Objekte auf diese Spalte zugreifen.

Wie kann ich die Migrationscode erhalten den Index zu löschen, dann ändern ändern Sie die Spalte und dann den Index neu bauen?

Ich verwende SQL Server 2008 R2

+0

Die Verwendung von eindeutigen Index mit Nullable Spalte ist seltsam. Null ist ein Wert wie jeder andere, so dass nur EINER Datensatz Nullwert haben kann, sonst erhalten Sie eine eindeutige Integritätsverletzung. –

+0

Ich dachte NULL! = NULL, aber glaube nicht, dass ich es selbst vor kurzem ausprobiert habe - es lohnt sich, das zu überprüfen. – Mark

+0

Ich möchte leere in der Kombinationsfeld eine gültige Option sein. Soll ich Null oder eine leere Zeichenfolge dafür haben? –

Antwort

8

So etwas vielleicht?

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

Ich denke, dass Sie auch SQL direkt wie unten ausführen können.

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

Das kann nützlich sein, wenn Sie eine Überprüfung hinzufügen möchten, ob der Index existiert oder so.

+0

Danke, deine Antwort funktioniert. Die SQL-Alternative schlägt jedoch fehl, wenn der Index nicht bereits vorhanden ist. –

+1

Ja, Sie müssten eine IF EXISTS-Anweisung haben, wenn Sie diese Robustheit wollten. Persönlich würde ich das Drop-Skript aus dem SQL-Management-Studio generieren und es einfügen, wie es normalerweise diese Überprüfung enthält. – Mark

+0

Ich sehe den Scheck nicht, wenn ich vom Managementstudio erzeuge. Mache ich es richtig? Klicken Sie mit der rechten Maustaste auf den Index und den Index des Skripts. Drop To ... Ich sehe eine Einstellung im Erstellungsskript. DROP_EXISTING –