2009-05-04 23 views
27

Tôi có một số phương pháp mà đối phó với DB và tất cả trong số họ bắt đầu bằng cách gọiC# LINQ-to-SQL - Nên DataContext được xử lý bằng IDisposable

FaierDbDataContext db = new FaierDbDataContext(); 

Kể từ khi đối tượng Linq2Sql DataContext thực hiện IDisposable, nên này được sử dụng với "sử dụng"?

using (FaierDbDataContext db = new FaierDbDataContext()) { 
    // use db here 
} 

Các tác động của việc sử dụng nó theo cách này hay cách khác là gì?

+8

Ngoài ra, một mặt lưu ý, đối với những người sử dụng LINQ bạn không nên giữ một biến thể hiện của DataContext của bạn cho các lớp mô hình dữ liệu của bạn. Thay vào đó, hãy khai báo mỗi khi bạn cần vào phương thức của mình. – mmcdole

Trả lời

29

Không giống như hầu hết các loại mà thực hiện IDisposable, DataContext không thực sự cần xử lý - ít nhất là không trong hầu hết các trường hợp. Tôi hỏi Matt Warren về quyết định thiết kế này, và đây là phản ứng của mình:

Có một vài lý do chúng tôi thực hiện IDisposable:

  • Nếu ứng dụng logic cần phải giữ được một thực thể ngoài khi DataContext được dự kiến ​​sẽ được sử dụng hoặc hợp lệ bạn có thể thực thi hợp đồng đó theo số gọi Dispose. Trình tải hoãn lại trong thực thể đó sẽ vẫn tham chiếu DataContext và sẽ cố gắng sử dụng nó nếu bất kỳ mã nào cố gắng điều hướng các thuộc tính bị trì hoãn . Những nỗ lực này sẽ không thành công. Vứt bỏ cũng buộc DataContext để đổ bộ nhớ cache của thể hóa thực thể để cho một đơn tổ chức lưu trữ sẽ không vô tình giữ còn sống tất cả các thực thể hóa qua DataContext đó, mà sẽ khác gây ra những gì dường như là một rò rỉ bộ nhớ .
  • Logic tự động đóng kết nối DataContext có thể là bị ngắt kết nối để rời khỏi kết nối mở. DataContext dựa trên mã ứng dụng liệt kê tất cả kết quả của truy vấn kể từ khi đến kết thúc của một kết quả kích hoạt kết nối để đóng. Nếu ứng dụng sử dụng phương thức MoveNext của IEnumerable thay vì tuyên bố foreach trong C# hoặc VB, bạn có thể thoát liệt kê sớm. Nếu sự cố trải nghiệm ứng dụng của bạn với các kết nối không đóng và bạn nghi ngờ hành vi đóng tự động không hoạt động, bạn có thể sử dụng mẫu Dispose làm việc xung quanh.

từ source

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