2012-04-11 29 views
13

Tôi đang sử dụng Entity Framework 4.2 (Mã đầu tiên) để truy cập cơ sở dữ liệu của tôi. Tôi đã được giả định rằng nếu tôi truy vấn một thực thể bằng cách sử dụng SingleOrDefault nó sẽ chỉ truy vấn cơ sở dữ liệu nếu thực thể đã không được theo dõi, nhưng điều này dường như không phải là trường hợp. Mặt khác, phương pháp Find có vẻ như đang thực hiện điều này. Vấn đề với Find là nó không xuất hiện để cho phép tôi tải dữ liệu liên quan.Mã khuôn khổ thực thể Tìm đầu tiên so với SingleOrDefault (Đang tải Eager)

Có cách nào để sử dụng phương pháp Find nhưng cũng háo hức tải dữ liệu không? Như một ví dụ, tôi muốn tải một cuốn sách và tất cả các ý kiến ​​của mình:

// Load book from the database 
Book book = context.Books.Find(1); 
context.Entry<Book>(book).Collection<Review>.Load(); // Book.Reviews is now populated 

// Load book from the change tracker 
// This will include all Reviews as well 
Book book2 = context.Books.Find(1); 

Với SingleOrDefault tôi có thể tải các xét khi tôi nhận được cuốn sách sử dụng Bao gồm:

// Load book + reviews from the database 
Book book = Book.Include("Reviews").SingleOrDefault(b => b.Id == 1); 

// Doing the same thing again requeries the database 
Book book2 = Book.Include("Reviews").SingleOrDefault(b => b.Id == 1); 

Có cách nào để có được hành vi của Find với mức tải mong muốn là SingleOrDefault?

Trả lời

11

Phương pháp Find là để tìm kiếm thực thể duy nhất theo khóa. Phương thức SingleOrDefault là để thực hiện truy vấn. Tải xuống có thể chỉ là một phần của truy vấn thực sự được thực thi trên cơ sở dữ liệu, vì vậy nó không thể được sử dụng với Find.

Là một workaround bạn có thể viết lại nó theo cách này:

// This will check only on in-memory collection of loaded entities 
Book book = context.Books.Local.SingleOrDefault(b => b.Id == 1); 
if (book == null) 
{ 
    book = context.Books.Include(b => b.Review).SingleOrDefault(b => b.Id == 1); 
} 
+0

Không có ý tưởng này tài sản địa phương tồn tại. Cảm ơn! – Dismissile

+0

Xin chào, và liên quan đến tốc độ hoạt động, Tìm vs SingleOrDefault để lấy thông tin Thực thể? – Patrick

0

Nếu tải chậm cho phép Tìm kiếm sẽ hoạt động cho bạn. Hãy thử điều này:

Book book = context.Books.Find(1); 
int n = book.Reviews.Count; 

Kiểm tra giá trị cho biến "n". EF phải tải bộ sưu tập khi bạn truy cập bộ sưu tập lần đầu tiên.

+2

điểm của ông là ông không muốn sử dụng lười biếng nạp và muốn họ háo hức tải. –

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