2012-04-11 76 views
13

我使用實體框架4.2(代碼優先)來訪問我的數據庫。我的假設是,如果我使用SingleOrDefault查詢實體,它只會查詢數據庫,如果該實體尚未被跟蹤,但似乎並非如此。另一方面,Find方法似乎確實正在這樣做。 Find的問題在於它似乎不允許我加載相關數據。實體框架代碼首先查找與SingleOrDefault(渴望加載)

有沒有辦法使用Find方法,但也急於加載數據?舉個例子,我想加載一本書,它所有的評論:

// 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); 

隨着SingleOrDefault當我使用這本書,我可以加載審覈包括:

// 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); 

有沒有一種辦法獲得Find的行爲與渴望加載SingleOrDefault

回答

11

Find方法是通過鍵搜索單個實體。 SingleOrDefault方法用於執行查詢。預加載只能是在數據庫中真正執行的查詢的一部分,因此它不能與Find一起使用。

作爲一種變通方法,你可以重寫它這樣:

// 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

不知道這個地方財產存在。謝謝! – Dismissile 2012-04-11 20:19:52

+0

嗨,關於操作的速度,Find vs SingleOrDefault獲取實體信息? – Patrick 2013-03-14 11:39:50

0

如果啓用延遲加載查找將適用於您。試試這個:

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

檢查「n」變量的值。當您第一次訪問收藏夾時,EF必須加載收藏夾。

+2

他的觀點是,他不希望使用延遲加載,並希望他們渴望加載。 – 2012-04-11 19:30:49