Làm thế nào để bạn đảm bảo rằng bối cảnh cơ sở dữ liệu của bạn được xử lý đúng cách khi bộ sưu tập lười biếng của bạn không còn cần thiết nữa?


8

Tôi đang tìm kiếm một loại thực hành tốt nhất của câu trả lời ở đây.

Cho rằng các cách thực hành tốt nhất để tương tác với các lớp thực hiện IDisposablelà thông qua Usingcâu lệnh - Cách thực hành tốt nhất để sử dụng tải lười biếng EF với MVC là gì?

Phương pháp điều khiển ví dụ:

<HttpGet>
Public Function Schedule(ByVal id As Int64) As ActionResult

    Dim model As Schedule = Nothing
    Using database As dataContext = New dataContext
        model = (From s In database.Schedules Where s.ScheduleID = id Select s).FirstOrDefault
    End Using

    Return View(theSchedule)

End Function

Ví dụ này làm cho việc tải lười biếng không hoạt động vì cơ sở dữ liệu [dataContext] được xử lý theo thời gian mà mô hình đến trong Chế độ xem.

Vì vậy, tôi đoán câu hỏi là:
Thực hành tốt nhất để sử dụng tải lười biếng trong MVC là gì? Làm thế nào để bạn đảm bảo rằng bối cảnh cơ sở dữ liệu của bạn được xử lý đúng cách và bạn không gây rò rỉ bộ nhớ?

Câu trả lời:


9

Nói chung, bạn không cần sử dụng các Usingcâu lệnh với ngữ cảnh dữ liệu Entity Framework. Bộ sưu tập lười biếng là một trong những lý do tại sao. Vì vậy, mã của bạn chỉ đơn giản là:

<HttpGet>
Public Function Schedule(ByVal id As Int64) As ActionResult

    Dim model As Schedule = Nothing
    Dim database As dataContext = New dataContext
    model = (From s In database.Schedules Where s.ScheduleID = id Select s).FirstOrDefault

    Return View(model)

End Function

Bối cảnh dữ liệu trong Entity Framework được thiết kế để mở và đóng các kết nối khi cần và chúng tự động xử lý khi đối tượng bối cảnh dữ liệu không còn cần thiết.

Hành vi mặc định của DbContext là kết nối cơ bản được tự động mở bất cứ lúc nào là cần thiết và đóng lại khi không còn cần thiết. Vd Vứt bỏ trên điều tra viên, sẽ đóng kết nối.

Lần duy nhất bạn sẽ phải cẩn thận IDisposablelà nếu bạn Overridehành vi mặc định của bối cảnh dữ liệu.

Đọc thêm

Tôi có luôn phải gọi Vứt bỏ trên DBContext không? Không.
Quản lý DbContext đúng cách với Entity Framework 6: hướng dẫn chuyên sâu


Tôi không chắc chắn rằng nửa sau của câu thứ tư của bạn là chính xác: "và họ tự động xử lý khi đối tượng bối cảnh dữ liệu vượt quá phạm vi". Vì bối cảnh dữ liệu nằm ngoài phạm vi theo thời gian trong Chế độ xem, sử dụng ví dụ của bạn, bối cảnh sẽ vẫn khả dụng và do đó không tự xử lý? Tui bỏ lỡ điều gì vậy?
Sam Axe

Không. Quyền của bạn; Tôi đã có một chút cẩu thả trong từ ngữ của tôi. Mô tả chính xác là DBContext tự xử lý khi không còn cần thiết; tức là bộ sưu tập lười biếng được liệt kê đầy đủ hoặc bị bỏ rơi. Xem thông tin cập nhật của tôi.
Robert Harvey

Cảm ơn bạn rất nhiều vì đã dành thời gian để trả lời điều này, Robert. Nó được nhiều đánh giá cao.
Sam Axe

1
Lưu ý rằng việc có một DBContext hoạt động tốt mà không có usingtuyên bố sẽ giúp việc phụ thuộc vào tiêm DBContext trở nên dễ dàng hơn nhiều , nếu muốn.
Robert Harvey

DI là thứ tôi sẽ tìm kiếm trong tương lai gần - vì vậy tôi sẽ ghi nhớ điều đó.
Sam Axe
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.