2012-03-29 6 views
6

Tôi có một cá thể cục bộ của cơ sở dữ liệu mà gần đây tôi đã tạo bằng cách sử dụng DbContext.Database.Create(), vì vậy bảng __MigrationHistory tồn tại với mục nhập InitalCreate khớp với mã tại thời điểm này.Làm cho di chuyển đầu tiên của mã EF4.3 bỏ qua việc di chuyển đang chờ xử lý

Tuy nhiên, một số di chuyển dựa trên mã có trong thư mục Di chuyển. Chúng sẽ được chạy trong các môi trường phát triển và dàn dựng của chúng tôi để đưa các cơ sở dữ liệu đó phù hợp với mã. Tôi không cần phải áp dụng chúng cục bộ, tuy nhiên, kể từ khi tôi tạo ra cơ sở dữ liệu bằng cách sử dụng mã hiện tại.

Tôi bây giờ cần thực hiện thay đổi đối với mô hình và tạo di chuyển tương ứng. Nhưng khi tôi chạy Add-Migration TestMigration, tôi nhận được lỗi sau

Unable to generate an explicit migration because the following explicit 
migrations are pending: 

[201203271113060_AddTableX, 
201203290856574_AlterColumnY] 

Apply the pending explicit migrations before attempting to generate 
a new explicit migration. 

Tôi nên làm gì trong trường hợp này? Tôi không thể chỉ công cụ Add-Migration ở môi trường khác bởi vì nó không đảm bảo rằng phiên bản phù hợp với những gì tôi có tại địa phương. Tôi muốn di chuyển chỉ khớp với những thay đổi tôi đã thực hiện.

Dường như tôi có một vài lựa chọn nhưng không ai là lý tưởng:

  1. Xóa di cư khác từ thư mục Migrations, hãy chạy lệnh Add-Migration, nâng cấp cơ sở dữ liệu, sau đó khôi phục lại di cư cũ. Điều này là đơn giản nhưng có vẻ hơi hackish.
  2. Hoàn nguyên về phiên bản của mô hình trong điều khiển nguồn mà lần di chuyển đầu tiên được áp dụng, sau đó tạo và sử dụng nó để tạo cơ sở dữ liệu. Sau đó lấy phiên bản mới nhất, áp dụng tất cả các di chuyển, sau đó tôi đã sẵn sàng để thêm di chuyển của mình. Điều này có vẻ như rất nhiều nỗ lực!
  3. Tạo di chuyển theo cách thủ công.

Có ai có bất kỳ đề xuất nào về cách quản lý điều này không?

Trả lời

2

Những gì tôi đã tìm thấy hiệu quả nhất là rất đơn giản: không sử dụng DbContext.Database.Create() khi bạn đã kích hoạt di chuyển. Nếu bạn muốn tạo một cơ sở dữ liệu mới theo lập trình, hãy sử dụng API di chuyển thay thế.

var migrator = new DbMigrator(new Configuration()); 
migrator.Update(); 

Sau đó, bạn đã có đầy đủ lịch sử di chuyển và thêm hoạt động di chuyển khác như mong đợi.

2

Chúng tôi đang có kế hoạch để sử dụng một biến thể của Lựa chọn của bạn # 1 ...

Chuẩn Thủ tục hành của chúng tôi là tạo ra một kịch bản SQL cho mỗi chuyển đổi (bằng cách sử dụng tùy chọn -script cập nhật cơ sở dữ liệu), theo thứ tự để có các kịch bản lệnh SQL được áp dụng cho cơ sở dữ liệu "sản xuất" của người dùng cuối bởi InstallShield (chúng tôi dự định sử dụng cơ sở dữ liệu cập nhật EF chỉ dành cho cơ sở dữ liệu của nhà phát triển).

Do đó, chúng tôi có cả tệp .cs di chuyển và tệp .sql tương ứng cho tất cả các lần di chuyển trong thư mục Di chuyển của chúng tôi. Vì vậy, thay vì xóa các di chuyển từ thư mục Migration (như bạn đã đề xuất trong # 1), chúng tôi sử dụng SQL Mgmt Studio để chỉ áp dụng thủ công các phần của tệp .sql làm việc chèn vào _MigrationHistory.

Điều đó mang đến cho _MigrationHistory của cơ sở dữ liệu cục bộ được cập nhật với các thay đổi đã được tích hợp vào cơ sở dữ liệu đó.

Nhưng đó là một kludge và chúng tôi vẫn đang tìm kiếm giải pháp tốt hơn.

DadCat

1

Tôi đã gặp phải vấn đề tương tự. Nếu bạn chạy

Update-database 

và sau đó chạy

Add-Migration YourMigrationName 

này giải quyết vấn đề

+1

Điều này không hoạt động vì các thao tác di chuyển trước đó không thể chạy trên cơ sở dữ liệu đã được tạo bằng cách sử dụng 'DbContext.Database.Create()'. Hãy tưởng tượng một di chuyển bổ sung thêm một cột, nhưng trong cơ sở dữ liệu cục bộ mới của bạn, bạn đã có cột đó để bạn nhận được một 'SqlException' và hàng liên quan không bao giờ được thêm vào bảng' __MigrationHistory'. Xem câu trả lời của tôi cho những gì tôi nghĩ là cách tiếp cận chính xác. –

1

Bạn cần chạy "update-database" từ bảng điều khiển trình quản lý gói để đẩy các thay đổi của bạn vào cơ sở dữ liệu HOẶC bạn có thể xóa tệp di chuyển đang chờ xử lý ([201203271113060_AddTableX]) khỏi thư mục Di chuyển của mình rồi chạy lại "thêm di chuyển "để tạo một di chuyển hoàn toàn mới dựa trên các chỉnh sửa của bạn.

0

chỉ cần loại trừ tệp di chuyển cũ khỏi tệp giải pháp.