2012-03-13 69 views
5

Tôi đang cố gắng để buộc EF Code Đầu tiên phải khởi tạo lại cơ sở dữ liệu. Suy nghĩ đầu tiên của tôi đã gọi:Mã EF Đầu tiên - Seeding sau khi xóa và sau đó tạo cơ sở dữ liệu

dbContext.Database.Delete();  
dbContext.Database.Create(); 

này tạo ra một cơ sở dữ liệu mới, nhưng chiến lược seeding (thiết lập sử dụng Database.SetInitializer <>) được bỏ qua. Tôi đang làm ở trên trong phương thức Application_Start. Bất kỳ ý tưởng?

Tôi cũng đã cố gắng:

dbContext.Database.Initialize(true); 
+0

Bạn có thể gửi Database.SetInitializer <> mã của bạn? –

Trả lời

0

Một lựa chọn là để tạo ra DatabaseInitializer của riêng bạn mà thừa hưởng từ DropCreateDatabaseAlways.

Ví dụ về điều này sẽ là.

public class MyInitializer : DropCreateDatabaseAlways<EmployeeContext> 
{ 
    protected override void Seed(EmployeeContext context) 
    { 
     context.Employees.Add(new Employee() {FirstName = "Marcy"}); 
     base.Seed(context); 
    } 
} 

public class EmployeeContext : DbContext 
{ 
    static EmployeeContext() 
    { 
     Database.SetInitializer(new MyInitializer()); // using my own initializer 
    } 

    public IDbSet<Employee> Employees { get; set; } 
} 
+0

Có. Tôi đã làm điều đó. Nhưng tôi không thể ép buộc nó chạy (mà không thay đổi mô hình.) –

0

Dưới đây là những gì tôi đã làm để khắc phục điều này:

  1. Thêm một lá cờ trong initializer ngữ cảnh của bạn

    public bool WasSeeded = false;

  2. Tạo phương pháp công khai trong trình khởi tạo của bạn và đặt mã hạt giống của bạn ở đó. Tôi đã thực hiện chắc chắn sử dụng chỉ AddOrUpdate hoặc các phương pháp upsert khác, tức là kiểm tra dữ liệu không có trong DB trước:

    context.Students.AddOrUpdate

Cuối cùng đặt cờ true

  1. Sau khi bạn khởi tạo bối cảnh, kiểm tra cờ và nếu nó là chạy sai logic bằng tay:

    nếu {(initializer.WasSeeded!)initializer.SeedAndUpsert (ngữ cảnh); }

0
Database.SetInitializer(new CustomInitializer()); //CustomInitializer contains the overriding Seed method 

using (var context = new CustomDatabaseContext()) 
{ 
    context.Database.Initialize(force: true); 
} 
Các vấn đề liên quan