2013-04-03 7 views
7

Mã trong việc di chuyển ban đầu của tôi là như sauEF di cư: Lỗi thay đổi một lĩnh vực được lập chỉ mục để nullable

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

Vì vậy, rằng trường Mô tả sẽ là duy nhất tôi đã thêm dòng sau vào phần cuối của Phương thức UP

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

Sau đó, tôi quyết định đặt trường Mô tả là bắt buộc.

Việc chuyển mới tạo ra sự thay đổi sau

AlterColumn ("dbo.Sites", "Mô tả", c => c.String (nullable: false, maxLength: 450));

Tuy nhiên khi sự thay đổi này cố gắng để chạy tôi nhận được một lỗi

ALTER TABLE ALTER COLUMN Mô tả thất bại vì một hoặc nhiều đối tượng truy cập vào cột này.

tôi đã có thể cô lập các dòng SQL sử dụng các hồ sơ, như

ALTER TABLE [dbo]. [Sites] ALTER COLUMN [Mô tả] nvarchar NOT NULL

Mà cho cho tôi lỗi sau khi tôi chạy nó trong Management Studio

Msg 5074, Cấp 16, Tiểu bang 1, Line 1 Chỉ mục ' IX_Description 'phụ thuộc vào cột' Mô tả '. Msg 4922, Cấp 16, Tiểu bang 9, Dòng 1 ALTER TABLE ALTER COLUMN Mô tả không thành công vì một hoặc nhiều đối tượng truy cập cột này.

Làm cách nào để lấy mã di chuyển để giảm chỉ mục, sau đó thay đổi thay đổi cột và sau đó tạo lại chỉ mục?

Tôi đang sử dụng SQL Server 2008 R2

+0

Sử dụng chỉ mục duy nhất có cột rỗng là lạ. Null là giá trị như bất kỳ khác để chỉ ONE hồ sơ sẽ có thể có giá trị Null nếu không bạn sẽ nhận được vi phạm ràng buộc duy nhất. –

+0

Tôi mặc dù NULL! = NULL nhưng không nghĩ rằng tôi đã thử nó bản thân mình gần đây - giá trị kiểm tra đó. – Mark

+0

Tôi muốn để trống là một tùy chọn hợp lệ trong hộp kết hợp. Tôi có nên có Null hoặc một chuỗi rỗng cho điều đó? –

Trả lời

8

Điều gì đó giống như vậy?

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

Tôi nghĩ bạn cũng có thể thực thi SQL trực tiếp như bên dưới.

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

Điều này có thể hữu ích nếu bạn muốn thêm kiểm tra chỉ mục tồn tại hoặc gì đó.

+0

Cảm ơn, câu trả lời của bạn hoạt động. Tuy nhiên, thay thế SQL không thành công nếu chỉ mục chưa có. –

+1

Có, bạn cần phải có một câu lệnh IF EXISTS nếu bạn muốn sự mạnh mẽ đó. Cá nhân tôi sẽ tạo ra kịch bản lệnh thả từ phòng quản lý SQL và dán vào đó như thường lệ bao gồm kiểm tra đó. – Mark

+0

Tôi không thấy séc khi tôi tạo từ studio quản lý. Tôi có làm đúng cách không? kích chuột phải vào chỉ mục và chỉ mục kịch bản Thả xuống ... Tôi thấy một thiết lập trong kịch bản tạo. DROP_EXISTING –