2011-11-23 32 views
6

Tôi có một nhỏ MVC 3 ứng dụng sử dụng Entity Framework Mã đầu tiên và sử dụng chuỗi kết nối này cho các mô hình:Entity Framework Mã Đầu và Kết nối Strings

data source=.\SQLEXPRESS;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|Journal.mdf;User Instance=true;Database=MyJournal 

Khi tôi thực hiện một thay đổi mô hình (ví dụ như thêm một tài sản), tôi nhận được như mong đợi

Mô hình ủng hộ bối cảnh 'JournalContext' đã thay đổi kể từ khi cơ sở dữ liệu được tạo.

Vì vậy, đang ở chế độ phát triển, tôi tiếp tục và xóa Journal.mdf và Journal.ldf.

Bây giờ khi tôi chạy các ứng dụng một lần nữa, tôi nhận được

không mở cơ sở dữ liệu "MyJournal" Có thể yêu cầu đăng nhập. Đăng nhập không thành công.

Nếu tôi thay đổi chuỗi kết nối của tôi để

data source=.\SQLEXPRESS;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|Journal.mdf;User Instance=true;Database=MyJournal2 

(thay đổi các tham số Database= bằng cách thêm '2')

Journal.mdf được tạo ra và các ứng dụng hoạt động một lần nữa. Nếu tôi thực hiện một số thay đổi và cố gắng "tái chế" bất kỳ tên Cơ sở dữ liệu nào một lần nữa, tôi sẽ gặp lỗi "Không thể mở".

Tại sao tôi cần phải cung cấp tên Cơ sở dữ liệu duy nhất mỗi lần tôi thay đổi mô hình và làm cách nào để "xóa sạch" các tên trước đó?

+0

Bạn có khởi động lại ứng dụng sau khi xóa cơ sở dữ liệu không? – StriplingWarrior

+0

@StriplingWarrior: Vâng, tôi. Tôi gặp lỗi khi khởi động lại ứng dụng. –

Trả lời

6

Bạn không cần tên cơ sở dữ liệu duy nhất mỗi lần. Khi một mô hình được tạo đầu tiên, nó chạy một DatabaseInitializer để làm những việc như tạo cơ sở dữ liệu nếu nó không có hoặc thêm dữ liệu hạt giống. DatabaseInitializer mặc định cố gắng so sánh lược đồ cơ sở dữ liệu cần thiết để sử dụng mô hình với một băm lược đồ được lưu trữ trong bảng EdmMetadata được tạo ra với cơ sở dữ liệu (khi Code First là cơ sở dữ liệu tạo ra). Nếu so sánh băm khác nhau thì nó sẽ ném lỗi đó.

Rõ ràng nếu bạn thay đổi chuỗi kết nối thì nó sẽ tạo một cơ sở dữ liệu hoàn toàn mới có tên 'MyJournal2'.

Cách để giải quyết vấn đề này là xóa bảng EdmMetadata và chạy trình khởi tạo lại. Bạn có thể thực hiện điều này bằng cách vào cửa sổ Database Explorer trong Visual Studio và kết nối với cơ sở dữ liệu của bạn, sau đó vào Tables, nơi bạn sẽ tìm thấy bảng EdmMetadata, kích chuột phải vào nó và chọn Delete.

Ngoài ra đặt

DbDatabase.SetInitializer(new DropCreateDatabaseIfModelChanges<dbType>()); 

trong phương pháp Application_Start của bạn trong Global.asax.cs. Điều này sẽ xóa cơ sở dữ liệu và tạo lại nó bất cứ khi nào lược đồ thay đổi.

Xem this video on pluralsight để biết thêm chi tiết, đặc biệt là phần 'Khi lớp học thay đổi'.

Đồng thời kiểm tra liên kết này cho DropCreateDatabaseIfModelChanges. Nó cho bạn biết về những gì thực sự xảy ra và làm thế nào để hạt giống cơ sở dữ liệu nếu bạn cần bằng cách tạo ra một lớp dẫn xuất.

+0

Tại sao tôi nhận được lỗi "quyền bị từ chối" khi tôi xóa tệp .mdf? Bảng EdmMetadata ở đâu nếu không có tệp .mdf bị xóa? –

+0

Tôi đã cập nhật câu trả lời của mình về cách xóa bảng EdmMetadata. Tôi khuyên bạn nên xem video tôi liên kết, nó sẽ cho bạn biết mọi thứ bạn cần biết. Bạn có thể nhận được lỗi "cho phép bị từ chối" vì một vài lý do, một là máy chủ web vẫn đang chạy và truy cập vào cơ sở dữ liệu đó. – link664

+0

Và có, tôi đã giả định rằng nếu bạn đã xóa tệp .mdf thì bản thân cơ sở dữ liệu phải được loại bỏ, bao gồm cả bảng EdmMetadata. Bạn xóa cơ sở dữ liệu như thế nào? Thông qua trình quản lý SQL Express? – link664

Các vấn đề liên quan