2012-06-25 27 views
6

Tôi đã tạo hai DbContexts, một là dành cho cấu hình ứng dụng, thứ hai là để ghi nhật ký.Nhiều DbContext, nhiều Database.SetInitializer

Lý do là, tôi muốn đặt kích thước tối đa trên db nhật ký để không sử dụng hết dung lượng đĩa trống và ngăn cơ sở dữ liệu khác hoạt động.

Trong tập global.asax.cs tôi, tôi có như sau:

 protected void Application_Start() 
    { 

     AreaRegistration.RegisterAllAreas(); 

     RegisterGlobalFilters(GlobalFilters.Filters); 
     RegisterRoutes(RouteTable.Routes); 

     Database.SetInitializer<AdminContext>(new AdminInitialiser()); 
     Database.SetInitializer<LoggingContext>(new LoggingInitialiser()); 
    } 

Phương pháp InitializeDatabase trong LoggingInitialiser không được gọi. Đây có phải vì chỉ có một bộ khởi tạo có thể được đặt? Có cách nào để có initializers cho hai DbContexts?

Trả lời

8

Đặt trình khởi tạo trong hàm tạo DbContext thay thế.

public class AdminContext : DbContext 
{ 
    public AdminContext() 
    { 
     Database.SetInitializer(new AdminInitialiser()); 
    } 
} 

public class LoggingContext : DbContext 
{ 
    public LoggingContext() 
    { 
     Database.SetInitializer(new LoggingInitialiser()); 
    } 
} 
+3

Không có rủi ro mà việc này sẽ bị gọi nhiều lần không? Tôi nghi ngờ initialisation là tốn kém, ngay cả khi không có thay đổi để triển khai. Làm thế nào về nếu bạn đặt nó trong một constructor tĩnh, có nghĩa là nó sẽ chỉ bao giờ được gọi là một lần? – Holf

3

Có bạn có thể làm điều đó. Bạn chỉ cần khởi tạo trước khi chuyển sang bước tiếp theo.

Database.SetInitializer<MyDBContext>(myInitializer); 
    MyDbContext context = new MyDbContext(); 
    context.Database.Initialize(false); 

    Database.SetInitializer<MySecondDBContext>(myInitializer); 
    MySecondDbContext context2 = new MySecondDbContext(); 
    context2.Database.Initialize(false); 

Lưu ý: rằng tôi thường lấy ví dụ DbContext từ một trình giải quyết phụ thuộc ...

3

Tôi đề nghị để đặt cuộc gọi SetInitializer để constructor tĩnh như dưới đây:

static ApplicationIdentityDbContext() 
    { 
     Database.SetInitializer(new IdentityDbInitializer()); 
    } 

Dưới đây là từ MSDN

Một hàm tạo tĩnh được sử dụng để khởi tạo bất kỳ dữ liệu tĩnh nào hoặc để thực hiện một hành động cụ thể cần s được thực hiện một lần duy nhất. Nó được gọi tự động trước khi cá thể đầu tiên được tạo ra hoặc bất kỳ thành viên tĩnh nào được tham chiếu.

Vì vậy, hàm tạo tĩnh là lý tưởng để khởi tạo cơ sở dữ liệu. Tôi đã sử dụng kỹ thuật này cho nhiều cơ sở dữ liệu và nó hoạt động tốt cho tôi.

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