溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Entity?Framework?Core延遲加載的方法怎么使用

發(fā)布時間:2022-02-23 09:43:43 來源:億速云 閱讀:245 作者:iii 欄目:開發(fā)技術(shù)

本文小編為大家詳細介紹“Entity Framework Core延遲加載的方法怎么使用”,內(nèi)容詳細,步驟清晰,細節(jié)處理妥當(dāng),希望這篇“Entity Framework Core延遲加載的方法怎么使用”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學(xué)習(xí)新知識吧。

眾所周知在EF 6 及以前的版本中,是支持懶加載(Lazy Loading)的,可惜在EF Core 并不支持,必須使用Include方法來支持導(dǎo)航屬性的數(shù)據(jù)加載。不過現(xiàn)在EF Core的開發(fā)團隊打算恢復(fù)對這一功能的支持(目前還未發(fā)布,不過可以在Github上面下載進行測試)。

懶加載

懶加載也可以叫做按需加載、延遲加載??梢苑謨煞矫鎭砝斫猓环矫嬷笗簳r不需要該數(shù)據(jù),不用在當(dāng)前馬上加載,而可以推遲到使用它時再加載;另一方面指不確定是否將會需要該數(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 ICollection<OrderDetail> OrderDetails { 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)用程序中使用,只需在DbContextOnConfiguring方法中添加對UseLazyLoadingProxies()擴展方法調(diào)用即可。

框架目前是通過Castle.Core框架來生成代理類來實現(xiàn)對導(dǎo)航屬性的延遲加載,開發(fā)團隊打算將該功能做為EF Core的可選安裝包。

讀到這里,這篇“Entity Framework Core延遲加載的方法怎么使用”文章已經(jīng)介紹完畢,想要掌握這篇文章的知識點還需要大家自己動手實踐使用過才能領(lǐng)會,如果想了解更多相關(guān)內(nèi)容的文章,歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI