Làm cách nào để tách các đối tượng trong Entity Framework Code trước?


Câu trả lời:


156

Nếu bạn muốn tách đối tượng hiện có, hãy làm theo lời khuyên của @ Slauma. Nếu bạn muốn tải các đối tượng mà không theo dõi các thay đổi, hãy sử dụng:

var data = context.MyEntities.AsNoTracking().Where(...).ToList();

Như đã đề cập trong bình luận này sẽ không hoàn toàn tách rời các thực thể. Chúng vẫn được đính kèm và lười tải các tác phẩm nhưng các thực thể không được theo dõi. Điều này nên được sử dụng ví dụ nếu bạn chỉ muốn tải thực thể để đọc dữ liệu và bạn không có kế hoạch sửa đổi chúng.


3
@Ladislav: Đây thực sự có lẽ là ý nghĩa của lập trình viên Lol. Tôi chưa bao giờ sử dụng và nghĩ về phương pháp này mặc dù tôi thường tải danh sách đối tượng và xử lý bối cảnh cùng một lúc, đại loại như thế using(ctx){ return ctx....ToList(); }. Trong những trường hợp như vậy, việc sử dụng AsNoTracking()sẽ có ý nghĩa rất lớn bởi vì tôi sẽ tiết kiệm việc lấp đầy bối cảnh đối tượng một cách không cần thiết. Tôi đoán nó có thể có một lợi ích tiêu thụ hiệu năng và bộ nhớ đặc biệt là cho các danh sách lớn, phải không?
Slauma

1
@Slauma: Có nó có lợi ích hiệu suất. Đó thực sự là lý do tại sao phương pháp này tồn tại. Sử dụng phương pháp này trong API ObjectContext phức tạp hơn một chút.
Ladislav Mrnka

2
Điều này có vô hiệu hóa tải lười biếng?
Shawn Mclean

3
Trên thực tế, điều này sẽ không vô hiệu hóa tải lười biếng, nó sẽ chỉ vô hiệu hóa theo dõi thay đổi và cải thiện hiệu suất = thực thể vẫn được đính kèm. Tôi đã tìm thấy nó sau khi trả lời câu hỏi này vì vậy bạn nên đánh dấu câu trả lời của @ Slauma là câu trả lời hợp lệ.
Ladislav Mrnka

1
Đây là những gì tôi muốn. Tôi muốn tải nhanh và khả năng chỉ sửa đổi một thực thể tách rời.
Shawn Mclean

255

Đây là một lựa chọn:

dbContext.Entry(entity).State = EntityState.Detached;

3
Tôi có thể làm điều này khi truy xuất các đối tượng trả về IQueryable không?
Shawn Mclean

1
@Lol coder: Tôi không chắc là tôi hiểu bạn đúng chưa, nhưng entityphải là một đối tượng cụ thể hóa của một loại là một phần của các lớp mô hình của bạn (Người, Khách hàng, Đơn hàng, v.v.). Bạn không thể trực tiếp chuyển vào <T> IQueryable dbContext.Entry(...). Đó có phải là câu hỏi mà bạn muốn nói không?
Slauma

9
@EladBenda: Nó phụ thuộc. Nếu bạn muốn tách một đối tượng đã được gắn vào bối cảnh, hãy đặt trạng thái thành Detached. Nếu bạn muốn tải các thực thể từ DB mà không gắn chúng vào bối cảnh (không theo dõi thay đổi), hãy sử dụng AsNoTracking.
Slauma

1
Tôi tìm thấy một vấn đề thú vị với phương pháp này. Mặc dù thực thể có thể là một lớp proxy, tải lười biếng sẽ không hoạt động sau khi bạn thay đổi trạng thái của nó thành Detached.
kjbartel

4
@kjbartel: đây là hành vi dự kiến, vì thực thể không có liên kết với bối cảnh.
Ricardo Souza
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.