canonical answer nơi đặt các cuộc gọi Database.SetInitializer
vào số Global.asax
cho các dự án web. Tôi đang tìm một tùy chọn khác.Tránh Phẫu thuật Shotgun với Cơ sở dữ liệu.SetInitializer
Chúng tôi đang sử dụng Entity Framework 4.3.1 với Mã đầu tiên. Chúng tôi viết các dịch vụ web và các ứng dụng WinForms, và thường đặt mã truy cập dữ liệu (như DbContexts) vào các thư viện được chia sẻ.
Hiện nay, các nhà thầu của hậu duệ DbContext của chúng tôi trông như thế này:
public PricingContext(string connectionString)
: base(connectionString)
{
Database.SetInitializer<PricingContext>(null);
}
95% thời gian, đó là mặc định đúng đắn. 5% thời gian (một số bài kiểm tra tích hợp, phát triển greenfield, vv) nó không phải.
Nếu chúng tôi di chuyển mã đó vào khởi tạo (hoặc cấu hình) của các dịch vụ và ứng dụng của chúng tôi, hãy thêm DbContext mới vào thư viện liên quan đến Shotgun Surgery. Tất cả các dự án này phải được cập nhật, ngay cả khi thư viện không hiển thị trực tiếp ngữ cảnh.
đối số tùy chọn là một trong những khả năng:
public PricingContext(string connectionString,
IDatabaseInitializer<PricingContext> databaseInitializer = null)
: base(connectionString)
{
Database.SetInitializer<PricingContext>(databaseInitializer);
}
Trọng chiến lược mặc định có thể liên quan đến việc đi qua các initializer qua nhiều lớp, mặc dù.
Chúng tôi cũng đã cân nhắc tạo trình khởi tạo dựa trên phản chiếu để đặt tất cả ngữ cảnh cho một chiến lược cụ thể.
Phương pháp hay nhất là gì?
Cảm ơn bạn! Sau khi thử điều này và thảo luận nhiều, chúng tôi quyết định đi với thiết lập initializers tại các địa điểm nơi DbContexts đang được tạo ra (hoặc nơi một DI/IoC Container đang được cấu hình). Tại thời điểm đó, chúng ta biết ngữ cảnh là gì. Vì vậy, câu hỏi ban đầu của tôi dựa trên các giả định bị lỗi. – TrueWill