8

Trước tiên, tôi đã đọc những câu hỏi/câu trả lời:Không thể chạy EF5 di chuyển với cơ sở dữ liệu hiện có

Những tất cả dường như được cho EF các phiên bản trước EF5 và tình hình của tôi dường như không phù hợp với những câu trả lời này. Vì vậy, hãy để tôi mô tả tình hình của tôi.

  1. Ứng dụng của tôi ban đầu được tạo bằng EF4, trước tiên. Tôi đã thiết kế cơ sở dữ liệu của mình với trình thiết kế GUI và sử dụng nó để tạo cơ sở dữ liệu của tôi.
  2. Tôi đã chạy và thu thập dữ liệu vào cơ sở dữ liệu trong một vài tháng. Tôi thực sự không thể mất dữ liệu này.
  3. Tôi phân nhánh mã, cài đặt EF5 với NuGet và sử dụng Công cụ điện EF để tạo mô hình của tôi từ cơ sở dữ liệu của tôi bằng cách nhấp chuột phải vào dự án thư viện lớp mới và chọn Entity Framework | Reverse engineer code first.
  4. Tôi có thể tham khảo lại dự án mới của mình một cách suôn sẻ, chuyển đổi dự án của tôi để sử dụng DbContext mới thay vì ObjectContext và xóa thư viện lớp EF4 đã giữ mô hình cũ của tôi. Chương trình hoạt động tuyệt vời!

Bây giờ, tôi muốn thử tính năng di chuyển tự động mà tôi đã có một chút trải nghiệm với Ruby on Rails. Dưới đây là những gì tôi đã làm:

  1. Ran Enable-Migrations. Đã có một chút rắc rối do các chuỗi kết nối và app.config nào đã được sử dụng, nhưng cuối cùng đã nhận được nó. Tuy nhiên, this MSDN page nói rằng điều này sẽ tự động tạo ra lần di chuyển đầu tiên để đưa tôi đến điểm tôi đã có. Nó không.
  2. Ran Add-Migration InitialSchema để thực hiện những gì không được thực hiện tự động trong bước 1. Điều này đã hiệu quả.
  3. Thêm một tài sản để một trong những đối tượng mô hình của tôi, sau đó cố gắng chạy Add-Migration AddSerialToLogEntries, và đã được trình bày với:

Không thể để tạo ra một chuyển đổi rõ ràng vì di cư rõ ràng sau đang chờ giải quyết: [201307190100268_InitialSchema] . Áp dụng di chuyển rõ ràng đang chờ xử lý trước khi thử tạo một di chuyển rõ ràng mới .

Cố gắng áp dụng di chuyển trên cơ sở dữ liệu hiện tại của tôi không thành công, điều này không đáng ngạc nhiên.

Các câu trả lời khác tôi đã đề cập ở trên về cơ bản nói rằng tôi không may mắn, nhưng như tôi đã nói những câu hỏi đó dành cho các phiên bản cũ hơn của Khung thực thể. Tôi có lựa chọn nào ở đây không? Trong khi viết câu hỏi này, tôi nghĩ tôi có thể sử dụng SQL Server Management Studio để xuất dữ liệu của tôi sang tập lệnh SQL, xóa toàn bộ cơ sở dữ liệu, để EF tạo nó, sau đó chạy các tập lệnh để lấy lại dữ liệu của tôi ... Tôi sẽ cố gắng vào ngày mai khi tôi có thời gian, nhưng tôi muốn nghe nếu có những lựa chọn khác vì tôi không chắc chắn 100% sẽ hoạt động và sẽ ghét có bất kỳ lỗi nào trong dữ liệu được chèn vào trong tiến trình.

Trả lời

12

Bật bật-di chuyển. Đã có một chút rắc rối do các chuỗi kết nối và app.config nào đã được sử dụng, nhưng cuối cùng đã nhận được. Tuy nhiên, trang MSDN này nói rằng điều này sẽ tự động tạo ra các di chuyển đầu tiên để đưa tôi đến điểm tôi đã ở. Nó không.

Ran Add-Migration InitialSchema để thực hiện những gì không phải là được thực hiện tự động trong bước 1. Điều này đã hiệu quả.

Thực tế, lệnh enable-migrations chỉ tạo một lần di chuyển ban đầu nếu cơ sở dữ liệu của bạn đã được tạo bằng mã-đầu trước đó trong trường hợp cơ sở dữ liệu chứa bảng __MigrationHistory. Nếu bảng này không tồn tại (đó là trường hợp khi bạn có một cơ sở dữ liệu hiện tại chưa bao giờ được tạo trước đó với Mã-Đầu tiên) enable-migrations chỉ tạo ra lớp Configuration. Bạn phải gọi add-migration theo cách thủ công để tạo lớp di chuyển đầu tiên. Vì vậy, hành vi bạn đã thấy được mong đợi.

Nói chung các thủ tục để chuẩn bị một cơ sở dữ liệu hiện có cho sự di cư là những điều sau nếu bạn đang sử dụng EF 5:

  • Gọi enable-migrations trong quản lý gói giao diện điều khiển. Một thư mục Migrations trong dự án của bạn và lớp học Configuration sẽ được tạo.

  • Mở lớp Configuration và đặt AutomaticMigrationsEnabled = false trong hàm tạo (nếu nó chưa được mặc định).

  • Trong gói quản lý giao diện điều khiển cuộc gọi

    add-migration -IgnoreChanges InitialSchema 
    

    "InitialSchema" chỉ là một cái tên chẳng hạn. Bạn có thể đặt tên cho nó như bạn muốn. Một lớp học <Timestamp>_InitialSchema sẽ được tạo ra có nguồn gốc từ DbMigration. Các phương thức UpDown trong lớp này bị trống do cờ -IgnoreChanges. Nếu không có cờ này, lớp sẽ chứa một sự di trú để thêm toàn bộ mô hình của bạn vào cơ sở dữ liệu mà không phải là những gì bạn muốn vì cơ sở dữ liệu hiện có đã có lược đồ cơ sở dữ liệu.

  • Chạy update-database trong bảng điều khiển trình quản lý gói. Vì phương thức Up không có gì với lược đồ hiện tại của bạn ngoại trừ nó tạo ra bảng __MigrationHistory (dưới dạng bảng hệ thống trong cơ sở dữ liệu của bạn) và thêm bản ghi đầu tiên vào bảng này có chứa băm mô hình của mô hình EF hiện tại của bạn.

  • Bước cuối cùng tùy chọn: Nếu bạn muốn làm việc với di chuyển tự động, hãy mở lớp Configuration và đặt AutomaticMigrationsEnabled = true trong hàm tạo. Nếu bạn muốn tiếp tục di chuyển dựa trên mã, hãy để lại cờ false.

Tại thời điểm này, bạn có thể bắt đầu thay đổi mô hình của mình. Mỗi khi bạn tạo một di chuyển mới với add-migration, nó sẽ dựa trên mô hình của bạn trước khi sửa đổi và lớp di chuyển sẽ chỉ chứa các thay đổi lược đồ cần thiết.

+0

Câu trả lời tuyệt vời, chi tiết. Tôi sẽ thử các bước của bạn càng sớm càng tốt. Tôi biết tôi có thể "hoàn tác" cho phép di chuyển bằng cách xóa thư mục Migrations, nhưng tôi có thể đơn giản là xóa các phương thức Up và Down của di chuyển đầu tiên thay vì xóa nó và bắt đầu lại không? – Steve

+0

@Steve: Vâng, điều đó cũng có tác dụng. – Slauma

+0

Làm việc tuyệt vời, cảm ơn bạn! – Steve

3

tôi sẽ đề nghị một cách tiếp cận hơi khác nhau mà sẽ để lại cho bạn trong một tiểu bang nơi bạn có thể dùng di cư để tạo ra cơ sở dữ liệu từ đầu trong môi trường phát triển của bạn:

  1. Thay vì gọi add-migration -IgnoreChanges InitialSchema, cố gắng để có được tạo ra việc di chuyển lược đồ ban đầu để làm việc. Như bạn nói, điều này sẽ xảy ra khi ban đầu bạn được gọi là Enable-Migrations. Bạn có thể thử trỏ kết nối cơ sở dữ liệu của mình tại cơ sở dữ liệu không tồn tại để làm việc này.

  2. Do đó, di chuyển InitialSchema của bạn sẽ chứa logic để tạo cơ sở dữ liệu như khi bạn thiết kế ngược lại. Bạn cần phải nhận xét nội dung của Up()Down() cho đến khi bạn triển khai tất cả các môi trường đã có sẵn cơ sở dữ liệu.

  3. Sau đó, bạn có thể bỏ ghi chú nội dung của các phương pháp đó và từ đó trên, trong môi trường phát triển của bạn, bạn có thể thả cơ sở dữ liệu và tái tạo chúng bằng cách sử

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

    và bạn sẽ có trọn bộ di chuyển trong bảng __MigrationHistory của bạn. Điều này quan trọng vì không có nó, bạn sẽ không thể thêm di chuyển mới trong tương lai.