網(wǎng)站首頁 編程語言 正文
眾所周知在EF 6 及以前的版本中,是支持懶加載(Lazy Loading)的,可惜在EF Core 并不支持,必須使用Include
方法來支持導(dǎo)航屬性的數(shù)據(jù)加載。不過現(xiàn)在EF Core的開發(fā)團隊打算恢復(fù)對這一功能的支持(目前還未發(fā)布,不過可以在Github上面下載進行測試)。
懶加載
懶加載也可以叫做按需加載、延遲加載。可以分兩方面來理解,一方面指暫時不需要該數(shù)據(jù),不用在當前馬上加載,而可以推遲到使用它時再加載;另一方面指不確定是否將會需要該數(shù)據(jù),所以暫時請不要加載,待確定需要后再加載它。懶加載是一種很重要的數(shù)據(jù)訪問特性,可以有效地減少與數(shù)據(jù)源的交互(注意,這里所提的交互不是指交互次數(shù),而是指交互的數(shù)據(jù)量),從而提升程序性能。
EF 6 懶加載
我們先來看一看在EF 6中的懶加載的使用方式。
實體定義:
public class Order { public int OrderID { get; set; } public string CustomerID { get; set; } public DateTime? OrderDate { get; set; } public virtual ICollectionOrderDetails { get; set; } } public class OrderDetail { public int OrderID { get; set; } public int ProductID { get; set; } public decimal UnitPrice { get; set; } public short Quantity { get; set; } public float Discount { get; set; } public virtual Order Order { get; set; } }
我們在這里定義訂單、訂單明細實體,它們是一對多關(guān)系,通過OrderId
字段進行關(guān)聯(lián)。
using (NorthwindContext context = new NorthwindContext()) { Order order = await context.Orders.SingleAsync(item => item.OrderID == 10253); Assert.NotNull(order); Assert.NotNull(order.OrderDetails); Assert.Equal(3, order.OrderDetails.Count); } }
在查詢訂單號為 10253 的訂單后,如果我們需要訪問訂單的明細,不需要再編寫一次數(shù)據(jù)查詢的代碼,直接訪問導(dǎo)航屬性即可,EF會自動幫我們填充屬性的值。
懶加載需要注意以下兩點:
- 在配置中啟用了懶加載(默認開啟);
- 實體類不能是封閉(
sealed
)類,導(dǎo)航屬性必須是虛(virtual
)屬性。
在 EF Core 中啟用懶加載
目前EF Core發(fā)布的最新版本中并不支持懶加載,開發(fā)人員必須使用Include
方法,才能完成導(dǎo)航屬性的加載。
using (NorthwindContext context = new NorthwindContext()) { Order order = await context.Orders.Include(e => e.OrderDetails).SingleAsync(item => item.OrderID == 10253); Assert.NotNull(order); Assert.NotNull(order.OrderDetails); Assert.Equal(3, order.OrderDetails.Count); }
大家需要在Github上面下載最新的源代碼來測試這一功能?aspnet/EntityFrameworkCore。
啟用懶加載:
public class NorthwindContext : DbContext { protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { var sqlConnectionStringBuilder = new SqlConnectionStringBuilder { DataSource = "****", InitialCatalog = "Northwind", UserID = "sa", Password = "sa" }; optionsBuilder.UseSqlServer(sqlConnectionStringBuilder.ConnectionString); optionsBuilder.UseLazyLoadingProxies(); base.OnConfiguring(optionsBuilder); } }
要在通常的應(yīng)用程序中使用,只需在DbContext
的OnConfiguring
方法中添加對UseLazyLoadingProxies()
擴展方法調(diào)用即可。
框架目前是通過Castle.Core
框架來生成代理類來實現(xiàn)對導(dǎo)航屬性的延遲加載,開發(fā)團隊打算將該功能做為EF Core的可選安裝包。
原文鏈接:https://www.cnblogs.com/tdfblog/p/entity-framework-lazy-loading.html
相關(guān)推薦
- 2023-01-20 Python-with?open()?as?f的用法及說明_python
- 2022-02-12 Flutter項目中有些依賴不支持64位的library的解決方式
- 2022-07-23 聊聊配置?Nginx?訪問與錯誤日志的問題_nginx
- 2022-07-11 docker給正在運行中的容器添加映射端口
- 2022-12-04 Python中的配對函數(shù)zip()解讀_python
- 2022-05-29 C#實現(xiàn)語音播報功能_C#教程
- 2022-06-22 Android中TextView動態(tài)設(shè)置縮進距離的方法_Android
- 2022-07-14 C++簡明分析講解引用與函數(shù)提高及重載_C 語言
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支