21

Tôi có một dự án về MVC. Chúng tôi đã chọn EF cho các giao dịch DB của mình. Chúng tôi đã tạo một số nhà quản lý cho lớp BLL. Tôi thấy rất nhiều ví dụ, trong đó "using" tuyên bố được sử dụng, ví dụ:Cách sử dụng EF (khung pháp nhân) sử dụng câu lệnh "sử dụng"

public Item GetItem(long itemId) 
    { 
     using (var db = new MyEntities()) 
     { 
      return db.Items.Where(it => it.ItemId == itemId && !it.IsDeleted).FirstOrDefault(); 
     } 
    } 

Ở đây chúng ta tạo một đối tượng mới của DBcontext MyEntities(). Chúng tôi sử dụng "using" để "ensure the correct use of IDisposable objects."

Đó chỉ là một phương pháp trong trình quản lý của tôi. Nhưng tôi có hơn mười người trong số họ. Mỗi khi tôi gọi bất kỳ phương thức nào từ người quản lý, tôi sẽ sử dụng "using" và tạo 01 DBmột DBcontext khác trong bộ nhớ. Khi thu gom rác (GC) sẽ xử lý chúng? Ai biết?

Nhưng có một cách thay thế khác về cách sử dụng các phương pháp của người quản lý. Chúng tôi tạo ra một biến toàn cầu:

private readonly MyEntities db = new MyEntities(); 

và sử dụng DBcontext trong mọi phương pháp mà không tuyên bố "using". Và phương pháp trông như thế này:

public Item GetItem(long itemId) 
{ 
    return db.Items.Where(it => it.ItemId == itemId && !it.IsDeleted).FirstOrDefault(); 
} 

Câu hỏi:

  1. cách sử dụng đúng các biến DBcontext là gì?
  2. Điều gì sẽ xảy ra nếu chúng tôi không sử dụng câu lệnh "usage" (vì nó ảnh hưởng đến hiệu suất) - GC sẽ làm tất cả vì điều đó?

Tôi là một "tân binh" trong việc sử dụng EF và vẫn chưa tìm thấy câu trả lời không chính xác cho câu hỏi này.

+0

Tùy thuộc vào mức độ bạn muốn sử dụng. Lý tưởng nhất là bạn sẽ không khởi tạo nó trong bộ điều khiển của bạn ở tất cả, nhưng thay vì ** Tiêm ** nó (IoC/DI) theo cách mà bất cứ điều gì gọi là điều khiển (Nhà máy) có thể xác định suốt đời của bối cảnh. – Belogix

+0

Tại sao nó ảnh hưởng đến hiệu suất? Bạn đã đo nó và kết luận rằng bạn đang mất hiệu suất? Và GC không xử lý nó, bạn đang xử lý nó vì bạn đang sử dụng các câu lệnh. – Maarten

Trả lời

11

Tôi nghĩ bạn sẽ thấy nhiều người gợi ý kiểu mẫu này. Không chỉ cho tôi hay Henk DBContext handling

  • Vâng, Lý tưởng nhất là dùng báo cáo cho DBContext phân nhóm
  • Thậm chí tốt hơn đơn vị mô hình làm việc được quản lý bằng dùng, có một bối cảnh và định đoạt bối cảnh Just 1 of many UoW examples, this one from Tom Dykstra
  • Ban Trình quản lý công việc phải là Yêu cầu mới cho mỗi yêu cầu
  • Ngữ cảnh KHÔNG phải là chủ đề an toàn để đảm bảo mỗi luồng có ngữ cảnh riêng.
  • Hãy để bộ nhớ cache EF hoạt động sau hậu trường.
  • Kiểm tra thời gian tạo ngữ cảnh. sau khi một số yêu cầu Http. Bạn vẫn còn có một mối quan tâm?
  • Mong đợi sự cố nếu bạn lưu trữ ngữ cảnh tĩnh. bất kỳ loại truy cập đồng thời nào cũng sẽ bị tổn thương và nếu bạn đang sử dụng các cuộc gọi AJAX song song, giả sử 90 +% cơ hội của các vấn đề nếu sử dụng một ngữ cảnh tĩnh đơn.

For some performance tips, well worth a read

+1

Bằng cách này "Chỉ cần 1 trong nhiều ví dụ UoW, cái này từ Julie Lerman" là bởi Tom Dykstra không phải Julie Lerman –

+0

Thx cho sự chỉnh sửa Paul –

1

Các hợp hoặc thực hành tốt nhất cách sử dụng biến DBContext là với Sử dụng.

using (var db = new MyEntities()) 
    { 
     return db.Items.Where(it => it.ItemId == itemId && !it.IsDeleted).FirstOrDefault(); 
    } 

Lợi ích là nhiều việc được thực hiện tự động cho chúng tôi.Ví dụ một khi khối mã được hoàn thành, việc vứt bỏ được gọi.

mỗi MSDN EF Working with DbContext

Thời gian tồn tại của bối cảnh bắt đầu khi dụ được tạo ra và kết thúc khi dụ là một trong hai thanh lý khoản hoặc thu gom rác. Sử dụng sử dụng nếu bạn muốn tất cả các tài nguyên mà ngữ cảnh kiểm soát là được xử lý ở cuối khối. Khi bạn sử dụng, trình biên dịch sẽ tự động tạo một khối thử/cuối cùng và các cuộc gọi được xử lý trong khối cuối cùng sẽ bị chặn.

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