2012-07-12 20 views
6

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ì?

Trả lời

6

Cách tạo lớp DBContextBootstrapper mà bạn có thể khởi tạo trong Global.asax của mọi dự án; trong đó thực hiện bộ khởi tạo cho mọi ngữ cảnh.

Bằng cách này nếu bạn thêm một dbcontext mới, bạn phải thực hiện thay đổi trong bootstrapper chỉ, không phải trong mọi dự án.

+0

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

2

EF 4.3 (và mới hơn) cũng bao gồm khả năng define initializer from configuration file vì vậy bạn sẽ không cần phải đặt mã ở tất cả nhưng nó vẫn sẽ yêu cầu bạn duy trì nhiều cấu hình.

@ Lời khuyên của Hasan trông giống như giải pháp tốt nhất cho bạn.

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