Làm cách nào để tạo lại cơ sở dữ liệu cho Entity Framework?


143

Tôi đã rơi vào tình trạng tồi tệ với dự án ASP.Net MVC 5 của mình, sử dụng Khung thực thể Code-First. Tôi không quan tâm đến việc mất dữ liệu, tôi chỉ muốn có thể bắt đầu mới, tạo lại cơ sở dữ liệu và bắt đầu sử dụng di chuyển Code-First.

Hiện tại tôi đang ở trạng thái mà mọi nỗ lực Cập nhật Cơ sở dữ liệu đều dẫn đến một ngoại lệ bị ném hoặc nhận thông báo lỗi. Ngoài ra trang web không thể truy cập cơ sở dữ liệu chính xác. Làm cách nào tôi có thể xóa tất cả các lần di chuyển, tạo lại cơ sở dữ liệu và bắt đầu lại từ đầu mà không phải tạo dự án mới? Nói cách khác, tôi muốn giữ mã của mình nhưng bỏ cơ sở dữ liệu.

Sau này tôi cũng sẽ muốn đồng bộ hóa cơ sở dữ liệu triển khai (SQL Server trên Azure). Một lần nữa, tôi không ngại bỏ tất cả dữ liệu - tôi chỉ muốn làm cho nó hoạt động.

Vui lòng cung cấp bất kỳ bước hướng dẫn nào để trở lại trạng thái sạch sẽ. Nhiều đánh giá cao.


TBH nếu bạn muốn đơn giản DROP DATABASEthì ....
Worthy7

Câu trả lời:


209

Thực hiện theo các bước dưới đây:

1) Trước tiên, hãy truy cập Server Explorer trong Visual Studio, kiểm tra xem Kết nối dữ liệu ".mdf" cho dự án này có được kết nối hay không, nếu vậy, nhấp chuột phải và xóa.

2) Chuyển đến Solution Explorer, nhấp vào hiển thị biểu tượng Tất cả tệp.

3) Truy cập App_Data, nhấp chuột phải và xóa tất cả các tệp ".mdf" cho dự án này.

4) Xóa thư mục Di chuyển bằng cách nhấp chuột phải và xóa.

5) Chuyển đến SQL Server Management Studio, đảm bảo DB cho dự án này không có ở đó, nếu không hãy xóa nó.

6) Chuyển đến Bảng điều khiển quản lý gói trong Visual Studio và nhập:

  1. Enable-Migrations -Force
  2. Add-Migration init
  3. Update-Database

7) Chạy ứng dụng của bạn

Lưu ý: Trong bước 6 phần 3, nếu bạn gặp lỗi "Không thể đính kèm tệp ...", có thể là do bạn đã không xóa hoàn toàn các tệp cơ sở dữ liệu trong SQL Server.


Thông minh! Điều này đã làm việc, cảm ơn bạn! Thực sự rất hữu ích. Các bước có giống nhau để tạo lại cơ sở dữ liệu triển khai (Azure SQL) không?
Toby Sharp

xin chào @TobySharp, không vấn đề gì. Nếu bạn không có bất kỳ dữ liệu nào trong cơ sở dữ liệu của mình, bạn có thể làm theo các bước sau, nhưng nếu bạn có dữ liệu, các bước không hoàn toàn giống nhau.
Lin

Tôi không có bất kỳ dữ liệu nào tôi cần giữ.
Toby Sharp

3
Cập nhật, nếu bạn xóa khỏi VS (như hướng dẫn nói) và không phải Windows Explorer, thì nó hoạt động. Ngoài ra, nếu bạn không có SQL Management Studio, bạn có thể sử dụng Sql Object Explorer trong VS để xóa khỏi localdb.
Mike Ward

3
Nếu bạn gặp phải lỗi "Không thể đính kèm tệp ...", mặc dù bạn tin rằng bạn đã xóa mọi thứ, hãy thử câu trả lời từ chuỗi này: stackoverflow.com/questions/13275054/
Andy

44

Tôi muốn thêm rằng câu trả lời của Lin là chính xác.

Nếu bạn xóa không đúng cách, bạn sẽ phải sửa nó. Để sửa các kết nối bị vặn trong dự án với MDF. Câu trả lời ngắn; tạo lại và xóa nó đúng cách

  1. Tạo một loại gỗ mới và đặt tên giống như loại gỗ cũ, đặt nó vào cùng một vị trí thư mục. Bạn có thể tạo một dự án mới và tạo một mdf mới. Các mdf không phải phù hợp với các bảng cũ của bạn, vì sẽ xóa nó. Vì vậy, tạo hoặc sao chép một cái cũ vào thư mục chính xác.
  2. Mở nó trong máy chủ thám hiểm [nhấp đúp chuột vào mdf từ giải pháp thám hiểm]
  3. Xóa nó trong trình thám hiểm máy chủ
  4. Xóa nó khỏi giải pháp thám hiểm
  5. chạy update-database -force [Sử dụng vũ lực nếu cần thiết]

Xong, hãy tận hưởng db mới của bạn

CẬP NHẬT 11/12/14 - Tôi sử dụng điều này mọi lúc khi tôi thực hiện thay đổi db. Tôi thấy đây là một cách tuyệt vời để quay lại quá trình di chuyển của bạn về db ​​ban đầu:

  • Đưa db trở lại ban đầu
  • Chạy di chuyển bình thường để đưa nó trở lại hiện tại

    1. Update-Database -TargetMigration:0 -force [Điều này sẽ phá hủy tất cả các bảng và tất cả dữ liệu.]
    2. Update-Database -force [sử dụng vũ lực nếu cần thiết]

1
Rất vui được giúp đỡ ... Tôi sẽ cập nhật câu trả lời của mình. Gần đây tôi đã tìm thấy một cách tốt hơn để khôi phục tất cả các thay đổi.
Steve Coleman

8

Điều này làm việc cho tôi:

  1. Xóa cơ sở dữ liệu khỏi SQL Server Object Explorer trong Visual Studio. Nhấp chuột phải và chọn xóa.
  2. Xóa các tệp mdf và ldf khỏi hệ thống tệp - nếu chúng vẫn còn ở đó.
  3. Giải pháp xây dựng lại.
  4. Bắt đầu ứng dụng - cơ sở dữ liệu sẽ được tạo lại.

1
Vâng, tất cả những gì tôi phải làm là xóa MDF, cập nhật chuỗi kết nối trong web.config, sau đó chạy ứng dụng và đăng ký tài khoản mới. Nó tự động tạo lại tất cả các bảng trong cơ sở dữ liệu mới.
Dan Bechard

3

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.


1

Chỉ muốn thêm vào câu trả lời tuyệt vời của @Lin:

5) B. Nếu bạn không có SQL Management Studio, hãy chuyển đến "SQL Server Object Explorer". Nếu bạn không thể thấy db dự án của mình trong localdb "SQL Server Object Explorer", thì hãy nhấp vào nút "Thêm máy chủ SQL" để thêm nó vào danh sách theo cách thủ công. Sau đó, bạn có thể xóa db khỏi danh sách.


Nếu bạn muốn thêm một cái gì đó vào một câu trả lời, xin vui lòng thêm một nhận xét cho câu trả lời đó thay vì đăng một câu trả lời mới.
Oliver

1
Tôi đã không nhận thức được điều đó. Vì vậy, bây giờ bạn có thể chuyển câu trả lời của mình thành một nhận xét và xóa câu trả lời này vì về mặt kỹ thuật nó không phải là câu trả lời (hoàn chỉnh) cho câu hỏi :-)
Oliver

0

Một sửa chữa rất đơn giản có thể làm việc cho tôi. Sau khi xóa mọi tham chiếu và kết nối cơ sở dữ liệu bạn tìm thấy trong trình thám hiểm máy chủ / máy chủ, nhấp chuột phải vào thư mục App_Data (không hiển thị bất kỳ đối tượng nào trong ứng dụng cho tôi) và chọn mở. Sau khi mở, đặt tất cả các cơ sở dữ liệu / vv. các tập tin trong một thư mục sao lưu hoặc nếu bạn có can đảm chỉ cần xóa chúng. Chạy ứng dụng của bạn và nó sẽ tạo lại mọi thứ từ đầu.


0

Giải pháp của tôi phù hợp nhất cho :
- đã xóa tệp mdf của bạn
- muốn tạo lại db của bạn.

Để tạo lại cơ sở dữ liệu của bạn, bạn cần thêm kết nối bằng Visual Studio.

Bước 1 : Truy cập Server Explorer thêm kết nối mới (hoặc tìm biểu tượng thêm db).

Bước 2 : Thay đổi Datasource đến Microsoft SQL Server cơ sở dữ liệu tập tin .

Bước 3 : thêm bất kỳ tên cơ sở dữ liệu nào bạn muốn trong trường Tên tệp cơ sở dữ liệu . (Tốt nhất là cùng tên bạn có trong thuộc tính web.config AttachDbFilename )

Bước 4 : nhấp vào duyệt và điều hướng đến nơi bạn sẽ muốn được đặt.

Bước 5 : trong lệnh chạy trình quản lý góiupdate-database

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.