Tải háo hức trong Entity Framework là gì

Gần đây, chúng tôi có một dự án khách hàng thú vị mà chúng tôi muốn chia sẻ với bạn trong bài đăng trên blog này. Chúng tôi được giao nhiệm vụ xây dựng một ứng dụng web trong đó cơ sở dữ liệu của khách hàng chứa nhiều đối tượng với một số lượng lớn các thuộc tính điều hướng cho mỗi đối tượng. Ngoài ra, có rất nhiều thuộc tính lồng nhau sẽ làm phức tạp thêm quá trình. Hai yếu tố này đại diện cho một thách thức khó khăn mà chúng tôi quản lý để giải quyết

Ứng dụng web phải được phát triển bằng cách sử dụng. NET và cụ thể hơn - Điều khiển giao diện người dùng Kendo tiến độ,. NET 5 và Entity Framework Core 6 [EFC6]. Một thách thức khác là chúng tôi được khách hàng cung cấp cơ sở dữ liệu, vì vậy chúng tôi phải sử dụng phương pháp tiếp cận cơ sở dữ liệu đầu tiên. Phương pháp hay nhất của chúng tôi đối với các dự án mới là khuyên khách hàng của chúng tôi sử dụng phương pháp ưu tiên mã thay thế

Chúng tôi đã xử lý các thách thức nêu trên liên quan đến tải dữ liệu và đặc biệt là tải háo hức như thế nào?

Chà, hãy xem qua 3 cách bạn có thể tải dữ liệu từ cơ sở dữ liệu trong EFC6

  • Háo hức tải. Một quy trình trong đó dữ liệu liên quan được tải từ cơ sở dữ liệu như một phần của truy vấn ban đầu
  • tải chậm. Dữ liệu liên quan được tải trong suốt từ cơ sở dữ liệu khi thuộc tính điều hướng được truy cập
  • tải rõ ràng. Dữ liệu liên quan được tải rõ ràng từ cơ sở dữ liệu ở giai đoạn sau

Sau khi thử nghiệm và nghiên cứu kỹ lưỡng, nhóm đã quyết định sử dụng tùy chọn Eager Loading được triển khai trong EFC 6

Tại sao chúng tôi chọn Eager Loading?

  1. Chúng tôi cần gửi các khối dữ liệu [không phải tất cả các đối tượng cùng một lúc mà là một phần của các đối tượng với tất cả các thuộc tính có liên quan của chúng được tải] trong sự kiện trang tải

  2. Có nhiều thuộc tính lồng nhau với độ sâu khoảng 7 cấp độ/lớp

  3. Entity Framework có một tính năng tích hợp để tự động xây dựng và quản lý các thuộc tính điều hướng [còn được gọi là sửa chữa mối quan hệ] thậm chí tái sử dụng chúng nếu chúng đã được tải trước đó mà không cần truy cập lại cơ sở dữ liệu

Hãy tìm hiểu sâu hơn về EFC 6 Eager Loading

EFC 6 cung cấp cho chúng tôi tiện ích để liên kết mã với các mối quan hệ cơ sở dữ liệu và điều này có thể thực hiện được bằng cách sử dụng “. bao gồm” câu lệnh tại tầng Tải dữ liệu. Microsoft đã cung cấp một ví dụ hoàn hảo mà bạn có thể kiểm tra tại đây. Sau khi xem qua ví dụ, một thách thức khác của chúng tôi cũng được mô tả và giải quyết - vấn đề đa cấp. Một ví dụ về vấn đề đó là. Khách hàng chứa danh sách hóa đơn và mỗi hóa đơn chứa danh sách mặt hàng

EFC6 giải quyết vấn đề đó bằng cách sử dụng “. Phương thức ThenInclude”. Đây là cách chúng tôi quản lý để đạt được việc xây dựng ứng dụng hiệu suất cao, bền và ổn định bằng cách sử dụng. MẠNG 5 và EFC6

HƯỚNG DẪN DI CƯ

ASP. NET Web Forms sang ASP hiện đại. MẠNG

Nhận bản sao miễn phí của bạn

Nhận bản sao miễn phí của bạn

Cuối cùng, kinh nghiệm cá nhân của tôi

Trải nghiệm cá nhân của tôi khi làm việc với EFC6 rất tích cực vì giàn giáo của cơ sở dữ liệu hoạt động hoàn hảo, mô hình được tạo ra rất dễ sử dụng và dễ hiểu. Các tính năng tích hợp hỗ trợ tất cả các nhu cầu của tôi, giúp tôi có cơ hội tập trung nhiều hơn vào phần giao diện người dùng của dự án thay vì dành nhiều thời gian hơn cho lớp cơ sở dữ liệu và dịch vụ

Nếu có bất kỳ điều gì khác xuất hiện trong đầu bạn như một phần của giải pháp tiềm năng hoặc bạn cần trợ giúp xây dựng kiến ​​trúc phù hợp để truyền dữ liệu của mình, vui lòng liên hệ. Chúng tôi rất sẵn lòng giúp bạn xác định các điểm quan trọng và đi theo con đường đúng đắn thông qua việc giải quyết thử thách

Eager loading là kỹ thuật trong đó EF tải các thực thể liên quan cùng với thực thể chính. Tất cả các thực thể được tải trong một truy vấn duy nhất tới cơ sở dữ liệu, do đó tiết kiệm băng thông và thời gian CPU của máy chủ quan trọng. Điều này được thực hiện bằng phương thức Bao gồm, có hai lần quá tải. Một trong số đó lấy thuộc tính điều hướng là string. Phương thức Include khác là một phương thức mở rộng và linh hoạt hơn nhiều. Trong hướng dẫn này, chúng ta tìm hiểu cách làm cho tải các thực thể một cách háo hức. Chúng tôi cũng chỉ ra cách Eager Loading từ nhiều Cấp độ và nhiều Bảng

Mục lục

Sự nguy hiểm của lazy loading

Truy vấn sau lấy danh sách tất cả các sản phẩm từ cơ sở dữ liệu. Trong vòng lặp for, chúng tôi truy cập thuộc tính p.ProductModel.Name, xuất phát từ thuộc tính điều hướng liên quan ProductModel

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

 

sử dụng [AdventureWorks db = new AdventureWorks[]]

{

    db. Cơ sở dữ liệu. Nhật ký = Bảng điều khiển. Viết;

    var product = [from p in db.Sản phẩm

                   chọn p]. Danh sách tới[];

    foreach [var p in product]

    {

        Bảng điều khiển. WriteLine["{0} {1} {2}", . p.ID sản phẩm, p. Tên, p. Mô hình sản phẩm. Tên];

    }

    Bảng điều khiển. Dòng đọc[];

}

 

Giả sử bạn có 100 Sản phẩm trong bảng Sản phẩm của mình. Khi bạn lặp qua bộ sưu tập Products và truy cập vào ProductModel, EF sẽ kích hoạt một truy vấn để truy xuất thông tin chi tiết của ProductModel. Điều đó có nghĩa là EF gửi 100 truy vấn cho mỗi trong số 100 Sản phẩm đó, điều này rất kém hiệu quả

Chúng tôi có thể giải quyết vấn đề trên bằng cách tải xuống ProductModel một cách háo hức. cùng với Products. sử dụng một truy vấn duy nhất

Háo hức tải trong Entity Framework

Một trong những cách chúng ta có thể tải các thực thể một cách háo hức bằng cách sử dụng phương thức Include. Entity Framework tạo một truy vấn nối, khi nó nhìn thấy phương thức Include, do đó đưa tất cả các bản ghi vào một truy vấn duy nhất

Đoạn mã dưới đây minh họa việc sử dụng phương thức Include. trước khi thử bất kỳ mã nào. Bạn cũng nên ghi lệnh cơ sở dữ liệu vào bảng điều khiển để xem lệnh SQL mà Entity Framework gửi đến cơ sở dữ liệu

Có sẵn hai phiên bản của phương thức Bao gồm.

Phương thức mặc định mà bạn cần chỉ định Thuộc tính điều hướng dưới dạng một chuỗi

Phương thức còn lại từ không gian tên Include2. Nó nhận một biểu thức lambda, trong đó bạn cần chỉ định Thuộc tính điều hướng

Bao gồm phương pháp mặc định

Ví dụ sau sử dụng phương thức mặc định. Như bạn có thể thấy, chúng tôi sử dụng Include3 trên mô hình Products. ProductModel là tên của Thuộc tính điều hướng [không phải tên của thực thể]

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

 

sử dụng [AdventureWorks db = new AdventureWorks[]]

{

   //Vô hiệu hóa tải chậm

    db. Cấu hình. LazyLoadingEnabled = false;

    //Ghi lệnh SQL vào bảng điều khiển

    db. Cơ sở dữ liệu. Nhật ký = Bảng điều khiển. Viết;

 

    var product = [from p in db.Sản phẩm

                   . Bao gồm["Mẫu sản phẩm"]    //ProductModel table to be included in the result

                   ở đâu p. ID sản phẩm == 814

                   chọn p]. Danh sách tới[];   . p.ProductModel] // Sử dụng Biểu thức Lambda thay vì chuỗi

               ở đâu p. ID sản phẩm == 814

               chọn p]. Danh sách tới[];

 

Phương pháp p.ProductModel.Name0 được giới thiệu trong Entity Framework Core, Nó không có sẵn trong Entity Framework 6

Háo hức tải từ nhiều bảng

Bạn có thể tải nhiều bảng liên quan bằng cách sử dụng cú pháp sau. Trong đoạn mã dưới đây, chúng tôi có hai bảng ProductModelp.ProductModel.Name2

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

 

sử dụng [AdventureWorks db = new AdventureWorks[]]

{

   //Vô hiệu hóa tải chậm

    db. Cấu hình. LazyLoadingEnabled = false;

    db. Cơ sở dữ liệu. Nhật ký = Bảng điều khiển. Viết;

 

    var product = [from p in db.Sản phẩm

                    . Bao gồm[p = > . p.Mô hình sản phẩm]

                    . Bao gồm[p = > . p.Danh mục con sản phẩm]

                    ở đâu p. ID sản phẩm == 931

                    chọn p]. Danh sách tới[];

 

    foreach [var p in product]

    {

        Bảng điều khiển. WriteLine["{0} {1} {2}", . p.ID sản phẩm, p. Tên, p. Mô hình sản phẩm. Tên, p. Danh mục con sản phẩm. Tên]  ;

    }

}

 

Truy vấn SQL tương ứng

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

 

LỰA CHỌN

    [Mức độ1]. [ID sản phẩm] AS [ProductID],

    [Mức độ1]. [Tên] AS [Name],

    [Mức độ1]. [Số sản phẩm] AS [ProductNumber],

    [Mức độ1]. [Gắn cờ] AS [MakeFlag],

    [Mức độ1]. [Cờ Thành phẩm] AS [FinishedGoodsFlag],

    [Mức độ1]. [Màu] AS [Color],

    [Mức độ1]. [Mức độ an toàn] AS [SafetyStockLevel],

    [Mức độ1]. [ReorderPoint] AS [ReorderPoint],

    [Mức độ1]. [Chi phí tiêu chuẩn] AS [StandardCost],

    [Mức độ1]. [Giá niêm yết] AS [ListPrice],

    [Mức độ1]. [Kích thước] AS [Size],

    [Mức độ1]. [SizeUnitMeasureCode] AS [SizeUnitMeasureCode],

    [Mức độ1]. [Mã đơn vị đo trọng lượng] AS [WeightUnitMeasureCode],

    [Mức độ1]. [Trọng lượng] AS [Weight],

    [Mức độ1]. [Ngày sản xuất] AS [DaysToManufacture],

    [Mức độ1]. [Dòng sản phẩm] AS [ProductLine],

    [Mức độ1]. [Lớp] AS [Class],

    [Mức độ1]. [Kiểu dáng] AS [Style],

    [Mức độ1]. [ProductSubcategoryID] AS [ProductSubcategoryID],

    [Mức độ1]. [ProductModelID] AS [ProductModelID],

    [Mức độ1]. [Ngày bắt đầu bán] NHƯ [SellStartDate],

    [Mức độ1]. [SellEndDate] AS [SellEndDate],

    [Mức độ1]. [Ngày ngừng sản xuất] NHƯ [DiscontinuedDate],

    [Mức độ1]. [rowguid] AS [rowguid],

    [Mức độ1]. [Ngày sửa đổi] NHƯ [ModifiedDate],

    [Mức độ2]. [ProductModelID] AS [ProductModelID1],

    [Mức độ2]. [Tên] AS [Name1],

    [Mức độ2]. [Mô tả danh mục] AS [CatalogDescription],

    [Mức độ2]. [Hướng dẫn] NHƯ [Instructions],

    [Mức độ2]. [rowguid] AS [rowguid1],

    [Mức độ2]. [Ngày sửa đổi] NHƯ [ModifiedDate1],

    [Mức độ3]. [ProductSubcategoryID] AS [ProductSubcategoryID1],

    [Mức độ3]. [ProductCategoryID] AS [ProductCategoryID],

    [Mức độ3]. [Tên] AS [Name2],

    [Mức độ3]. [rowguid] AS [rowguid2],

    [Mức độ3]. [Ngày sửa đổi] NHƯ [ModifiedDate2]

    TỪ   [Sản xuất].[Sản phẩm] AS [Extent1]

    TRÁI BÊN NGOÀI THAM GIA [Production].[Mẫu sản phẩm] AS [ . Extent2] ON [Extent1].[ProductModelID] = [ . Extent2].[ProductModelID]

    TRÁI BÊN NGOÀI THAM GIA [Production].[Danh mục con sản phẩm] NHƯ [ . Extent3] ON [Extent1].[ProductSubcategoryID] = [ . Extent3].[ID tiểu thể loại sản phẩm]

    Ở ĐÂU 931 = [Extent1].[ID sản phẩm]

 

Háo hức tải nhiều cấp độ

Bạn cũng có thể tải các thực thể lên nhiều cấp bằng cú pháp sau. Câu lệnh bao gồm bao gồm cả bảng ____23 và bảng p.ProductModel.Name4 [lưu ý rằng cả hai đều là loại tham chiếu]. Truy vấn sẽ sử dụng phép nối để đưa dữ liệu từ cả hai bảng như hình bên dưới

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

 

sử dụng [AdventureWorks db = new AdventureWorks[]]

{

   //Vô hiệu hóa tải chậm

    db. Cấu hình. LazyLoadingEnabled = false;

    db. Cơ sở dữ liệu. Nhật ký = Bảng điều khiển. Viết;

 

    var person = [from p in db.Người bán hàng

                    . Bao gồm[p = > . p.Nhân viên. Người]

                    chọn p]. Nhận[5]. Danh sách tới[];

 

    foreach [var p in person]

    {

        Bảng điều khiển. WriteLine["{0}", p.Nhân viên. Người. Tên];

    }

}

 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

 

CHỌN TOP [5]

    [Mức độ1]. [BusinessEntityID] AS [BusinessEntityID],

    [Mức độ1]. [ID lãnh thổ] AS [TerritoryID],

    [Mức độ1]. [Hạn ngạch doanh số] AS [SalesQuota],

    [Mức độ1]. [Tiền thưởng] AS [Bonus],

    [Mức độ1]. [Pct hoa hồng] AS [CommissionPct],

    [Mức độ1]. [SalesYTD] AS [SalesYTD],

    [Mức độ1]. [Doanh số Cuối năm] NHƯ [SalesLastYear],

    [Mức độ1]. [rowguid] AS [rowguid],

    [Mức độ1]. [Ngày sửa đổi] NHƯ [ModifiedDate],

    [Mức độ2]. [BusinessEntityID] AS [BusinessEntityID1],

    [Mức độ2]. [Số ID quốc gia] AS [NationalIDNumber],

    [Mức độ2]. [ID đăng nhập] AS [LoginID],

    [Mức độ2]. [Cấp tổ chức] AS [OrganizationLevel],

    [Mức độ2]. [Chức danh công việc] AS [JobTitle],

    [Mức độ2]. [Ngày sinh] NHƯ [BirthDate],

    [Mức độ2]. [Tình trạng hôn nhân] NHƯ [MaritalStatus],

    [Mức độ2]. [Giới tính] NHƯ [Gender],

    [Mức độ2]. [Ngày thuê] NHƯ [HireDate],

    [Mức độ2]. [Cờ lương] AS [SalariedFlag],

    [Mức độ2]. [Giờ nghỉ] NHƯ [VacationHours],

    [Mức độ2]. [Giờ nghỉ ốm] NHƯ [SickLeaveHours],

    [Mức độ2]. [Cờ hiện tại] AS [CurrentFlag],

    [Mức độ2]. [rowguid] AS [rowguid1],

    [Mức độ2]. [Ngày sửa đổi] NHƯ [ModifiedDate1],

    [Tham gia 2]. [BusinessEntityID1] AS [BusinessEntityID2],

    [Tham gia 2]. [Kiểu người] AS [PersonType],

    [Tham gia 2]. [Kiểu Tên] AS [NameStyle],

    [Tham gia 2]. [Tiêu đề] AS [Title],

    [Tham gia 2]. [Tên] AS [FirstName],

    [Tham gia 2]. [Tên đệm] AS [MiddleName],

    [Tham gia 2]. [Họ] AS [LastName],

    [Tham gia 2]. [Hậu tố] AS [Suffix],

    [Tham gia 2]. [Quảng cáo qua email] AS [EmailPromotion],

    [Tham gia 2]. [Thông tin liên hệ bổ sung] AS [AdditionalContactInfo],

    [Tham gia 2]. [Nhân khẩu học] AS [Demographics],

    [Tham gia 2]. [rowguid1] AS [rowguid2],

    [Tham gia 2]. [ModifiedDate1] AS [ModifiedDate2]

    TỪ   [Doanh số].[Nhân viên bán hàng] NHƯ [Extent1]

    INNER THAM GIA [Nhân sự].[Nhân viên] AS [ . Extent2] ON [Extent1].[BusinessEntityID] = [ . Extent2].[ID doanh nghiệp]

    TRÁI BÊN NGOÀI THAM GIA  [SELECT [Extent3].[BusinessEntityID] AS [ . BusinessEntityID1], [Extent3].[Kiểu người] NHƯ [ . PersonType], [Extent3].[Kiểu Tên] AS [ . NameStyle], [Extent3].[Tiêu đề] AS [ . Title], [Extent3].[Tên] AS [ . FirstName], [Extent3].[Tên đệm] AS [ . MiddleName], [Extent3].[Họ] AS [ . LastName], [Extent3].[Hậu tố] AS [ . Suffix], [Extent3].[Quảng cáo qua email] AS [ . EmailPromotion], [Extent3].[Thông tin liên hệ bổ sung] AS [ . AdditionalContactInfo], [Extent3].[Nhân khẩu học] AS [ . Demographics], [Extent3].[rowguid] AS [ . rowguid1], [Extent3].[Ngày sửa đổi] NHƯ [ . ModifiedDate1], [Extent4].[ID doanh nghiệp] AS [BusinessEntityID2]

        TỪ  [Người].[Người] NHƯ [Extent3]

        TRÁI BÊN NGOÀI THAM GIA [HumanResources].[Nhân viên] AS [ . Extent4] ON [Extent3].[BusinessEntityID] = [ . Extent4].[ID doanh nghiệp] ] AS . [Join2] ON [Extent1].[BusinessEntityID] = [ . Join2].[BusinessEntityID2]

 

Ví dụ sau Truy vấn p.ProductModel.Name5 là một tập hợp cùng với p.ProductModel.Name6. Để có được p.ProductModel.Name7, chúng ta có thể sử dụng câu lệnh p.ProductModel.Name8. Hãy xem truy vấn phức tạp mà EF tạo cho tác vụ này

Tải chậm và tải háo hức trong Entity Framework là gì?

Trong khi tải chậm trì hoãn việc khởi tạo tài nguyên, tải háo hức khởi tạo hoặc tải tài nguyên ngay khi mã được thực thi . Tải háo hức cũng liên quan đến việc tải trước các thực thể liên quan được tham chiếu bởi một tài nguyên.

Tải chậm trong Entity Framework là gì?

Tải từng phần là quá trình theo đó một thực thể hoặc tập hợp các thực thể được tải tự động từ cơ sở dữ liệu vào lần đầu tiên một thuộc tính tham chiếu đến thực thể/các thực thể đó được truy cập. Lazy loading means delaying the loading of related data, until you specifically request for it.

Tải háo hức và tải lười biếng trong chế độ ngủ đông là gì?

Eager Loading là một mẫu thiết kế trong đó quá trình khởi tạo dữ liệu diễn ra ngay tại chỗ. Lazy Loading là một mẫu thiết kế mà chúng tôi sử dụng để trì hoãn việc khởi tạo một đối tượng miễn là có thể .

Tải chậm trong LINQ là gì?

Lazy Loading là gì? . Theo mặc định, LINQ to SQL tải các thực thể liên quan, sử dụng Lazy Loading. Có mối quan hệ một-nhiều giữa các thực thể Bộ phận và Nhân viên. the related entities are not loaded, until we iterate through them or bind them the data. By default, LINQ to SQL loads the related entities, using Lazy Loading. There is one-to-many relationship between Department and Employees entities.

Chủ Đề