2015-06-19 22 views
6

Trong một ứng dụng mà tôi đã kế thừa có điều này trong một bộ điều khiển cơ sở, mọi bộ điều khiển khác trong ứng dụng kế thừa từ.DbContext và hồ bơi kết nối

public BaseController() 
    { 
     db = new MyDbContext(); 

     db.Database.Log = s => Debug.Write(s); 
    } 

public MyDbContext() 
     : base("name=MyDbContext") 
    { 
     // hack to force Visual Studio to deploy the Entityframework.SqlServer package 
     var instance = SqlProviderServices.Instance; 
    } 

Do cách ứng dụng được thiết kế, ít nhất 2 bối cảnh được tạo theo yêu cầu. (Đó là một ứng dụng MVC và có một cuộc gọi đến HomeController trên mỗi trang cộng với bất kỳ bộ điều khiển khác được gọi cho một trang cụ thể.)

Câu hỏi của tôi là khi nào thì DbContext tạo kết nối với SQL Server? Là nó ngay lập tức khi bối cảnh được tạo ra, hoặc chỉ khi một truy vấn được thực hiện?

Nếu trước đây, tôi sẽ sử dụng 2 lần số kết nối với máy chủ SQL hơn là cần thiết và nếu đó là sau thì có thể không quá nhiều vấn đề.

Tôi không nghĩ rằng tôi có thể cấu trúc lại điều này trong tương lai gần, chắc chắn không phải không có sự biện minh. Những gì tiềm năng cạm bẫy của thiết kế này tôi nên được nhận thức?

Khuôn khổ thực thể 6.1.3

+0

Phiên bản nào của EF là điều này?Và bạn có thể chỉ cho chúng ta phương thức khởi tạo 'MyDbContext' không? Điều đó sẽ cung cấp các chi tiết cần thiết để trả lời câu hỏi của bạn. – sstan

+0

Đã cập nhật câu hỏi – MrBliz

Trả lời

3

Vì bạn không cố tạo và tự kết nối trong trình tạo ngữ cảnh, nên, như những người khác đang nói, EF sẽ nhận/giải phóng kết nối từ một nhóm kết nối nếu cần, không phải khi nó được xây dựng.

Thông báo trích dẫn này từ tài liệu EF:

Connections

Theo mặc định, bối cảnh quản lý các kết nối đến cơ sở dữ liệu. Bối cảnh mở ra và đóng các kết nối nếu cần. Ví dụ, ngữ cảnh mở một kết nối để thực hiện một truy vấn, và sau đó đóng kết nối khi tất cả các tập kết quả đã được xử lý.

Có những trường hợp bạn muốn kiểm soát nhiều hơn khi kết nối mở và đóng. Ví dụ, khi làm việc với SQL Server Compact, việc mở và đóng cùng một kết nối rất tốn kém. Bạn có thể quản lý quá trình này bằng tay bằng cách sử dụng thuộc tính Connection.

Xem các liên kết sau để biết thêm thông tin:

https://msdn.microsoft.com/en-us/data/jj729737

https://msdn.microsoft.com/en-us/data/dn456849

1

Kết nối chỉ được mở khi truy vấn được thực hiện. Hồ bơi kết nối được quản lý bởi các lớp ADO.NET (SqlConnection). Có nhiều trường hợp DbContext cho mỗi yêu cầu là không sao và đôi khi là cần thiết. Bạn sẽ không có hai lần kết nối nói chung.

3

Khuôn khổ thực thể tuân theo nguyên tắc mở muộn và đóng sớm. Vì vậy, nó chỉ mở ra kết nối khi nó cần quá, IE để thực hiện một truy vấn, sau đó nó đóng nó ngay khi có thể.

Nếu có thể, bạn nên chuyển sang một cá thể ngữ cảnh duy nhất theo yêu cầu. Điều này cũng giữ mọi thứ xảy ra trong yêu cầu trong một giao dịch duy nhất. Bạn có thể làm điều này khá dễ dàng nếu bạn đang sử dụng một thùng chứa Dependency Injection để khởi tạo bộ điều khiển của bạn.

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