Trong khi câu hỏi này được đặt ra trước khi không quan tâm đến dữ liệu, đôi khi việc bảo trì dữ liệu là điều cần thiết.
Nếu vậy, tôi đã viết một danh sách các bước về cách phục hồi cơn ác mộng Entity Framework khi cơ sở dữ liệu đã có các bảng có cùng tên ở đây: Cách khôi phục từ cơn ác mộng Entity Framework - cơ sở dữ liệu đã có các bảng có cùng tên
Rõ ràng ... một người điều hành đã thấy phù hợp để xóa bài viết của tôi vì vậy tôi sẽ dán nó vào đây:
Cách phục hồi cơn ác mộng Entity Framework - cơ sở dữ liệu đã có các bảng có cùng tên
Mô tả : Nếu bạn giống chúng tôi khi nhóm của bạn chưa quen với EF, bạn sẽ kết thúc ở trạng thái bạn không thể tạo cơ sở dữ liệu cục bộ mới hoặc bạn không thể áp dụng các bản cập nhật cho cơ sở dữ liệu sản xuất của mình. Bạn muốn quay lại môi trường EF sạch sẽ và sau đó tuân thủ những điều cơ bản, nhưng bạn không thể. Nếu bạn làm cho nó hoạt động để sản xuất, bạn không thể tạo một db cục bộ và nếu bạn làm cho nó hoạt động cho cục bộ, máy chủ sản xuất của bạn sẽ không đồng bộ. Và cuối cùng, bạn không muốn xóa bất kỳ dữ liệu máy chủ sản xuất nào.
Triệu chứng : Không thể chạy Cập nhật cơ sở dữ liệu vì nó đang cố chạy tập lệnh tạo và cơ sở dữ liệu đã có các bảng có cùng tên.
Thông báo lỗi: System.Data.SqlClient.SqlException (0x80131904): Đã có một đối tượng có tên '' trong cơ sở dữ liệu.
Bối cảnh vấn đề : EF hiểu cơ sở dữ liệu hiện tại ở đâu so với vị trí của mã dựa trên một bảng trong cơ sở dữ liệu có tên là dbo .__ MigrationHistory. Khi nó nhìn vào Tập lệnh di chuyển, nó cố gắng xem xét lại vị trí cuối cùng với tập lệnh. Nếu không thể, nó chỉ cố gắng áp dụng chúng theo thứ tự. Điều này có nghĩa, nó quay trở lại tập lệnh tạo ban đầu và nếu bạn nhìn vào phần đầu tiên trong lệnh UP, nó sẽ là CreeateTable cho bảng mà lỗi đã xảy ra.
Để hiểu chi tiết hơn về vấn đề này, tôi khuyên bạn nên xem cả hai video được tham chiếu tại đây:
https://msdn.microsoft.com/en-us/l Library / dn481501 (v = vs.113) .aspx
Giải pháp : Điều chúng ta cần làm là lừa EF nghĩ rằng cơ sở dữ liệu hiện tại đã được cập nhật trong khi không áp dụng các lệnh Tạo này. Đồng thời, chúng tôi vẫn muốn các lệnh đó tồn tại để chúng tôi có thể tạo cơ sở dữ liệu cục bộ mới.
Bước 1: Làm sạch DB sản xuất
Đầu tiên, tạo bản sao lưu db sản xuất của bạn. Trong SSMS, Nhấp chuột phải vào cơ sở dữ liệu, chọn "Nhiệm vụ> Xuất ứng dụng tầng dữ liệu ..." và làm theo lời nhắc. Mở cơ sở dữ liệu sản xuất của bạn và xóa / thả bảng dbo .__ MigrationHistory.
Bước 2: Làm sạch môi trường cục bộ
Mở thư mục di chuyển của bạn và xóa nó. Tôi giả sử bạn có thể lấy lại tất cả từ git nếu cần thiết.
Bước 3: Tái tạo ban đầu
Trong Trình quản lý gói, chạy "Bật-di chuyển" (EF sẽ nhắc bạn sử dụng -ContextTypeName nếu bạn có nhiều ngữ cảnh). Chạy "Thêm-di chuyển ban đầu -verbose". Điều này sẽ tạo tập lệnh ban đầu để tạo cơ sở dữ liệu từ đầu dựa trên mã hiện tại. Nếu bạn đã có bất kỳ thao tác hạt giống nào trong Cấu hình trước đó, thì hãy sao chép nó qua.
Bước 4: Thủ thuật EF
Tại thời điểm này, nếu chúng tôi chạy Cập nhật cơ sở dữ liệu , chúng tôi sẽ gặp lỗi ban đầu. Vì vậy, chúng ta cần lừa EF nghĩ rằng nó đã được cập nhật mà không cần chạy các lệnh này. Vì vậy, hãy đi vào phương thức Up trong Di chuyển ban đầu bạn vừa tạo và nhận xét tất cả.
Bước 5: Cập nhật cơ sở dữ liệu
Không có mã để thực thi quy trình Up, EF sẽ tạo bảng dbo .__ MigrationHistory với mục chính xác để nói rằng nó chạy tập lệnh này một cách chính xác. Đi và kiểm tra xem nếu bạn thích. Bây giờ, bỏ ghi chú mã đó và lưu lại. Bạn có thể chạy lại Cập nhật cơ sở dữ liệu nếu bạn muốn kiểm tra xem EF có nghĩ rằng nó cập nhật không. Nó sẽ không chạy bước Up với tất cả các lệnh CreatTable vì nó nghĩ rằng nó đã được thực hiện.
Bước 6: Xác nhận EF là HOẠT ĐỘNG cập nhật
Nếu bạn có mã chưa được áp dụng cho việc di chuyển, đây là điều tôi đã làm ...
Chạy "Add-Migration MissingMigations" Điều này thực tế sẽ tạo ra một tập lệnh trống. Bởi vì mã đã có sẵn, thực sự đã có các lệnh chính xác để tạo các bảng này trong tập lệnh di chuyển ban đầu, vì vậy tôi chỉ cần cắt các lệnh Tạo và các lệnh thả tương đương vào các phương thức Lên và Xuống.
Bây giờ, hãy chạy lại Cập nhật cơ sở dữ liệu và xem nó thực thi tập lệnh di chuyển mới của bạn, tạo các bảng thích hợp trong cơ sở dữ liệu.
Bước 7: Xác nhận lại và cam kết.
Xây dựng, thử nghiệm, chạy. Đảm bảo rằng mọi thứ đang chạy sau đó cam kết thay đổi.
Bước 8: Hãy để phần còn lại của nhóm bạn biết cách tiến hành.
Khi người tiếp theo cập nhật, EF sẽ không biết điều gì đã xảy ra với các tập lệnh mà nó đã chạy trước khi không tồn tại. Nhưng, giả sử rằng cơ sở dữ liệu địa phương có thể bị thổi bay và tạo lại, điều này hoàn toàn tốt. Họ sẽ cần bỏ cơ sở dữ liệu cục bộ của họ và thêm tạo lại từ EF. Nếu họ có các thay đổi cục bộ và di chuyển đang chờ xử lý, tôi khuyên họ nên tạo lại DB của mình trên master, chuyển sang nhánh tính năng của chúng và tạo lại các tập lệnh di chuyển đó từ đầu.
DROP DATABASE
thì ....