本文介紹一些改善EF代碼、優(yōu)化其性能的相關(guān)方法,如NoTracking,GetObjectByKey, Include等 ,還包括編譯查詢、存儲(chǔ)模型視圖以及沖突處理等內(nèi)容。 。
當(dāng)我們只需要讀取某些數(shù)據(jù)而不需要?jiǎng)h除、更新的時(shí)候,可以指定使用MergeOption.NoTracking的方式來(lái)執(zhí)行只讀查詢(EF默認(rèn)的方式是AppendOnly)。當(dāng)指定使用NoTracking來(lái)進(jìn)行只讀查詢時(shí),與實(shí)體相關(guān)的引用實(shí)體不會(huì)被返回,它們會(huì)被自動(dòng)設(shè)置為null。因此,使用NoTracking可以提升查詢的性能。示例代碼如下:
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
? ? ? ?}
GetObjectByKey
:
在EF中,使用GetObjectByKey方法獲取數(shù)據(jù)時(shí),它首先會(huì)查詢是否有緩存,如果有緩存則從緩存中返回需要的實(shí)體。如果沒(méi)有則查詢數(shù)據(jù)庫(kù),返回需要的實(shí)體,并添加在緩存中以便下次使用。
First:
總從數(shù)據(jù)庫(kù)中提取需要的實(shí)體。
因此,我們應(yīng)在合適的地方選擇GetObjectByKey方法來(lái)獲取數(shù)據(jù),以減少對(duì)數(shù)據(jù)庫(kù)的訪問(wèn)提升性能。示例代碼如下:
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
? ? ? ?}
此外,需要注意的是如果
GetObjectByKey
沒(méi)有獲取到符合條件的數(shù)據(jù),那么它會(huì)拋異常。為了避免此情況發(fā)生,在有可能出現(xiàn)異常的地方,我們應(yīng)該使用
TryGetObjectByKey
方法。
TryGetObjectByKey
方法獲取數(shù)據(jù)的方式和
GetObjectByKey
類似,只是當(dāng)沒(méi)有取到符合條件的數(shù)據(jù)時(shí),
TryGetObjectByKey
會(huì)返回
null
而不是拋異常。示例代碼如下:
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
? ? ? ?}
First:
當(dāng)我們使用First來(lái)獲取數(shù)據(jù),如果沒(méi)有符合條件的數(shù)據(jù),那么我們的代碼將會(huì)拋出異常。
FirstOrDefault:
當(dāng)我們使用
FirstOrDefault
來(lái)獲取的數(shù)據(jù),如果沒(méi)有符合條件的數(shù)據(jù),那么它將返回null。
顯然,對(duì)于一個(gè)良好的代碼,是對(duì)可以預(yù)見(jiàn)的異常進(jìn)行處理,而不是等它自己拋出來(lái)。示例代碼如下:
?
?
?
?
?
?
?
?
?
?
?
?
?
?
? ? ? ?}
EF
不支持實(shí)體的部分屬性延遲加載,但它支持實(shí)體關(guān)系的延遲加載。默認(rèn)情況,實(shí)體的關(guān)系是不會(huì)加載。如下代碼:
?
?
?
?
?
?
?
?
?
?
?
?
? ? ? ?}
上述代碼中,因?yàn)镺rders沒(méi)有被加載,所以在輸出Orders的時(shí)候,是不會(huì)有任何輸出的。
當(dāng)我們需要加載某些關(guān)聯(lián)的關(guān)系時(shí),可是用
Include
方法,如下代碼所示:
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
出處: http://www.cnblogs.com/xray2005
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
