6

Tôi phải tính toán lại các giá trị trên một tập hợp lớn các thực thể, cái khác.Nhiều truy vấn và quá nhiều lần mở/đóng cùng một kết nối

Trong quá trình đó, tất cả các thực thể tự theo dõi được thay đổi trong cùng một ObjectContext. Đối với mỗi thực thể cần được xử lý, một lượng nhỏ dữ liệu phải được tìm nạp từ cơ sở dữ liệu. Điều đó dẫn đến rất nhiều truy vấn SQL giống nhau nhưng sử dụng các tham số khác nhau.

Tôi đang sử dụng Giải pháp ORM Profiler phần mềm để lược tả các truy vấn được gửi đến cơ sở dữ liệu.

Các truy vấn có vẻ ổn với tôi. Chúng ngắn và không mất nhiều thời gian để thực thi.

Tuy nhiên, tôi đang bối rối về cách các hồ sơ cho thấy tôi làm thế nào các truy vấn đang thực sự xử lý:

enter image description here

Như bạn thấy, nó giữ mở và đóng kết nối cơ sở dữ liệu tương tự.

Bây giờ, hãy nhìn vào những lần đối với một mở/Query/Đóng kết nối duy nhất:

enter image description here

Dường như mở và đóng cửa một cơ sở dữ liệu chất thải kết nối thời gian.

Sau khi đọc this answer, tôi đã thay đổi mã của tôi vì vậy bây giờ nó trông như thế này:

using (var connection = new EntityConnection(ConfigurationManager.ConnectionStrings["MyEntities"].ConnectionString)) 
{ 
    using (var context = new MyEntities(connection)) 
    { 
     // ... 

bây giờ tôi có thể thấy rằng nó vẫn đang sử dụng cùng một kết nối (đó là tốt), nhưng, kết nối vẫn tiếp tục đóng và mở chính nó giữa các truy vấn.

Gert Arnold đề xuất rằng tôi mở kết nối rõ ràng trước khi sử dụng ngữ cảnh. Sau đó tôi đã sửa đổi mã của mình để trông giống như sau:

using (var connection = new EntityConnection(ConfigurationManager.ConnectionStrings["MyEntities"].ConnectionString)) 
{ 
    connection.Open(); 
    using (var context = new MyEntities(connection)) 
    { 
     // ... 

Bây giờ nó hoạt động! Mỗi truy vấn được gửi đến các kết nối cơ sở dữ liệu tương tự:

enter image description here

Tôi bây giờ tò mò như tại sao tôi cần phải mở kết nối trước khi sử dụng bối cảnh?

+0

Đây không phải là một trùng lặp. Tôi thực sự có thể tái sử dụng cùng một kết nối. Vấn đề là nó giữ mở/đóng chính nó giữa các truy vấn. –

+1

Nó cũng đóng khi bạn mở kết nối trước khi tạo ngữ cảnh? (Bằng cách này tôi nghĩ rằng mã của bạn không hoàn toàn chính xác: 'new EntityConnection' hai lần). –

+0

Nó hoạt động! Nhưng chỉ khi, như bạn đề nghị, tôi mở kết nối một cách rõ ràng trước khi sử dụng ngữ cảnh. Bạn có biết tại sao ? –

Trả lời

4

Có thể tạo ngữ cảnh bằng kết nối hiện có. Thật khó để tìm tài liệu về nó, nhưng nếu kết nối được mở một cách rõ ràng trước khi bối cảnh sử dụng nó, nó sẽ vẫn mở cho đến khi nó được đóng kín hoặc xử lý một cách rõ ràng. Tôi đã thử nghiệm điều này với một EF5 ObjectContext (mã LINQPad):

using (var conn = new EntityConnection(connectionString)) 
{ 
    conn.Open(); 
    using (var db = new InventoryContext(conn)) 
    { 
     db.Products.ToList(); 
     conn.State.Dump(); 
     db.SaveChanges(); 
     conn.State.Dump(); 
    } 
} 

Đầu ra là Open, Open. Khi kết nối không được mở, đầu ra là Closed, Closed.

+0

Cảm ơn rất nhiều! Nó hoạt động hoàn hảo bằng cách mở kết nối một cách rõ ràng trước khi sử dụng ngữ cảnh. Tôi đã chỉnh sửa câu hỏi của mình để hiển thị kết quả. –

1

Một giải pháp khác có thể là để mở kết nối khi DbContext được xây dựng:

public partial class QueryModel : DbContext 
{ 
    public QueryModel(string connectionName):base(connectionName) 
    { 
     this.Database.Connection.Open(); 
    } 
} 
Các vấn đề liên quan