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 Show
Ứ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
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?
Hãy tìm hiểu sâu hơn về EFC 6 Eager LoadingEFC 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Ư Cuối cùng, kinh nghiệm cá nhân của tôiTrả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à Mục lục Sự nguy hiểm của lazy loadingTruy 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 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 Chúng tôi có thể giải quyết vấn đề trên bằng cách tải xuống Háo hức tải trong Entity FrameworkMộ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 Đoạn mã dưới đây minh họa việc sử dụng phương thức Có sẵn hai phiên bản của phương thức Bao gồm. Bao gồm phương pháp mặc địnhVí 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 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(); <
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); } }
Truy vấn SQL tương ứng của phương pháp trê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
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] 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] Ở ĐÂU 814 = [Extent1].[ID sản phẩm]
Bao gồm Phương pháp LambdaPhương thức 1 2 3 4 5 6 7 8 9
sử dụng Hệ thống. Dữ liệu. Thực thể; //nhập nó trước
var product = (từ p in db.Sản phẩm . Bao gồm(p = > . 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 Háo hức tải từ nhiều bảngBạ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 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 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 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. |