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

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