2016-08-22 50 views
2

如何告訴DBContext的Find方法它應該急切地加載導航屬性/實體?如何使用DBContext指定急切加載查找方法

我有下面的代碼刪除聯想到相關的輔助實體:

Person primary = db.People.Find(Id); 
if (primary == null) 
    return new HttpStatusCodeResult(HttpStatusCode.BadRequest); 

// This line is required to load the related entity 
db.Entry(primary).Reference("Secondary").Load(); 

primary.Secondary = null; 
db.SaveChanges(); 

我不得不添加行db.Entry(primary).Reference("Secondary").Load();得到它的工作。我明白這是因爲實體框架使用延遲加載。我可以在Find方法中覆蓋它,並通過使用Eager版本的Find方法擺脫多餘的行嗎?

回答

-1

只是改變

Person primary = db.People.Find(Id); 

Person primary = db.People.Find(Id).FirstOrDefault(); 
0

或者你可以使用

var result = db.Person.Include(c=>c.Secondary).FirstOrDefault(entity=>entity.Id == Id); 

使用using System.Data.Entity;在包括LINQ的能力,否則你可以只使用字符串「次要「像這樣:.Include("Secondary")

6

預先加載由Include方法完成:

db.People.Include(p => p.Secondary) 

哪些可以跟隨FirstOrDefault(p => p.Id == id),例如。

Find是一種DbSet方法,首先嚐試在上下文的緩存中查找請求的實體。只有當它沒有被找到時,實體才從數據庫中獲取。

由於此特殊行爲(的Find),IncludeFind不能混合。當在緩存中找到根實體時,很難定義該做什麼,但要包含的實體不是(或僅部分)。它們是否應該從數據庫中提取?這意味着Find + Include總是必須查詢包含的實體的數據庫,因爲它不能依靠本地緩存完成。這將會破壞Find的目的。或者,如果根實體位於本地緩存中,應該只找到本地緩存中的實體?這會使方法的結果不明確。

在ASP.Net MVC(或Web API)操作方法中,Find幾乎不會有用,因爲大多數情況下,都會創建一個新的上下文,並且實體將從數據庫中提取一次。換句話說,緩存中沒有任何內容可以被返回。您可能需要使用該方法以獲得簡潔,但關於數據庫往返的效果與FirstOrDefault()相同。