2012-01-09 19 views
5

Tôi tạo ra một DbContext như vậy:Làm thế nào để tạo lại cơ sở dữ liệu trong EF nếu mô hình của tôi thay đổi?

public class myDB : DbContext 
    { 
    public DbSet<Party> Parties { get; set; } 
    public DbSet<Booking> Bookings { get; set; } 
    } 

này tạo DataBase của tôi và hai bảng above..Great

sau đó tôi quyết định thêm một DbSet vào trộn & tôi có một lỗi:

the model backing the 'Party' context has changed since the database was created

tôi nhận thức được các bản sửa lỗi cho điều này bằng modelbuilder.IncludeMetadataInDatabase = false;Database.SetInitializer<ClubmansGuideDB>(null);

1) Cách chính xác để thêm các lớp mới của tôi vào ngữ cảnh và tạo chúng trong DataBase là gì?

2) Trong nỗ lực vô ích của mình để giải quyết điều này bản thân tôi đã xóa các bảng và cố gắng chạy lại ứng dụng mà không thành công tôi sau đó xóa toàn bộ cơ sở dữ liệu và chạy lại và nó không tái tạo DB. Làm thế nào tôi có thể bắt đầu từ đầu - là có một số bộ nhớ cache một nơi nào đó?

+2

** vấn đề khung pháp nhân ** không phải là tiêu đề hay nhất mà tôi từng thấy. – gdoron

+0

Cách sử dụng nào là nhận xét đó, khi có quá nhiều câu trả lời hay? – LenPopLilly

Trả lời

15

Tôi tin rằng bạn' đang tìm kiếm:

Database.SetInitializer<ClubmansGuideDB>(new DropCreateDatabaseIfModelChanges<ClubmansGuideDB>()); 

Từ EF 4.1 trở lên.

Lưu ý rằng điều này giả định bạn có quyền thậm chí thả cơ sở dữ liệu của mình. Tôi làm điều này tại địa phương để dễ phát triển nhưng vô hiệu hóa nó trong dàn dựng/sản xuất (tôi làm một hướng dẫn Schema So sánh và đẩy những thay đổi của tôi).

Bằng cách này, để thử nghiệm, nếu bạn cần để buộc tái tạo cơ sở dữ liệu, bạn có thể làm:

using (var context = new ClubmansGuideDB()) { 
    context.Database.Initialize(force: true); 
} 

(using nếu bạn chưa có một tài liệu tham khảo để DB của bạn)

+0

Rất cám ơn, đây là câu trả lời duy nhất tạo lại DB – LenPopLilly

+0

Database.SetInitializer (mới DropCreateDatabaseIfModelChanges ()); Database.Initialize (true); tại sao không làm việc với tôi? – AminM

0

Thử đặt phương thức này vào phương thức Global.asax.cs Application_Start() của bạn.

Database.SetInitializer<DatabaseContext>(null); 

Để thiết lập lại cơ sở dữ liệu từ đầu trên ứng dụng chạy làm cho một lớp học như thế này

//Where myDB is your context 
public class EntityBase: DropCreateDatabaseAlways<myDB> 
{ 

} 

Sau đó, trong phương pháp Application_Start(), bạn có thể làm điều này

Database.SetInitializer(new EntityBase()); 
+0

bạn cũng có thể ghi đè phương thức Seed và điền vào cơ sở dữ liệu của bạn với dữ liệu kiểm tra. http://msdn.microsoft.com/en-us/library/gg679212(v=vs.103).aspx – Kyle

+0

Cảm ơn Kyle nhưng nó không hoạt động cho tôi – LenPopLilly

3

Bạn có thể cho phép Entity Framework tạo lại toàn bộ cơ sở dữ liệu bằng cách sử dụng Database Initializer hoặc nếu bạn muốn di chuyển dữ liệu, bạn có thể xem Code First Migrations

Sau đây sẽ tạo lại cơ sở dữ liệu của bạn khi mô hình thay đổi:

Database.SetInitializer<myDB>(new DropCreateDatabaseIfModelChanges<myDB>()); 
+0

Cảm ơn Wouter nhưng nó không hoạt động đối với tôi – LenPopLilly

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