Cơ Chế Truy Cập Dữ Liệu Trong Azure
- 01-07-2024
- Toanngo92
- 0 Comments
Mục lục
Entity Framework
Nó cung cấp một bộ công cụ và thư viện cho phép các nhà phát triển làm việc với cơ sở dữ liệu quan hệ bằng các đối tượng .NET. EF nhằm mục đích đơn giản hóa quá trình tương tác với cơ sở dữ liệu bằng cách cho phép các nhà phát triển làm việc với dữ liệu dưới dạng đối tượng và lớp, thay vì trực tiếp làm việc với các truy vấn SQL cụ thể cho cơ sở dữ liệu. Bảng bên dưới tóm tắt lịch sử phiên bản của EF.
Phiên bản (kèm theo các tính năng mới chính) | Năm |
2008 EF 1.0 được phát hành như một phần của .NET Framework 3.5 SP1. | 2008 |
2010 EF 4.0 được phát hành (POCO, foreign keys, lazy loading, templates). | 2010 |
2011 EF 4.1 được phát hành (DbContext và code first). | 2011 |
2012 EF 4.3 được phát hành (migrations). Nó cũng trở thành mã nguồn mở vào năm này. | 2012 |
EF 5.0 được phát hành (enums, spatial, và Table Valued Functions). | 2012 |
2013 EF 6.0 được phát hành (async, connection resiliency, custom conventions và stored procedures). | 2013 |
2014 EF 6.1 được phát hành. | 2014 |
2016 EF7 được đổi tên thành EF Core. | 2016 |
EF Core 1.0 được phát hành (mixed-eval, shadow state properties, unique constraints, sequences, batching, và attach graph APIs). | 2016 |
EF Core 1.1 được phát hành (memory-optimized tables). | 2017 |
2017 EF Core 2.0 được phát hành (table splitting, owned entities, global query filters, và function mapping). | 2017 |
EF 6.2 được phát hành. | 2017 |
2018 EF Core 2.1 được phát hành (lazy loading, value converters, keyless entity types, group by, constructor parameters, và seeding). | 2018 |
EF Core 2.2 được phát hành (spatial, owned collections, và query tags). | 2018 |
2019 EF Core 3.0 được phát hành (Azure Cosmos DB, async foreach, nullable reference types, single server query và interceptors). | 2019 |
EF 6.3 được phát hành (.NET Core). | 2019 |
EF 6.4 được phát hành. | 2019 |
EF Core 3.1 được phát hành. | 2019 |
2020 EF Core 5.0 được phát hành (many-to-many, TPT, collations, TVFs, filtered include, property bags, table rebuilds, exclude from migrations, và change tracking proxies). | 2020 |
2021 EF Core 6.0 được phát hành (performance improvements, compiled models, migration bundles, temporal tables, và pre-convention configuration). | 2021 |
2022 EF Core 7.0 được phát hành (TPC, JSON columns, value objects, bulk updates, templates, stored procedures, conventions, trimming support, entity splitting, group by improvements, raw SQL improvements, và migrations improvements). | 2022 |
2023 EF Core 8.0 được phát hành (support for raw SQL queries for unmapped types, lazy loading improvements, và support for Time Only và Date Only SQL Server data types). | 2023 |
EF tăng năng suất bằng cách giảm bớt công việc theo dõi dữ liệu được sử dụng trong các ứng dụng. Nó phục vụ như là phương tiện cơ bản để tương tác giữa các cơ sở dữ liệu quan hệ và các ứng dụng Microsoft .NET. Nó làm cho việc ánh xạ dễ dàng hơn giữa các đối tượng phần mềm và các bảng và cột của cơ sở dữ liệu quan hệ. Một Đối tượng-Quan hệ ánh xạ (ORM) giúp xây dựng kết nối cơ sở dữ liệu và thực hiện các lệnh. Nó cũng giúp cho kết quả truy vấn và tự động tạo ra kết quả như đối tượng ứng dụng. Hơn nữa, một ORM cho phép theo dõi các sửa đổi được thực hiện đối với các đối tượng. Khi cần thiết, các sửa đổi này có thể tồn tại trong cơ sở dữ liệu. EF là một framework ORM mạnh mẽ và linh hoạt được phát triển bởi Microsoft cho các ứng dụng .NET. EF hỗ trợ các loại truy vấn khác nhau, các truy vấn này được chuyển đổi thành các truy vấn SQL cho các cơ sở dữ liệu cơ bản. Một trong những loại này là Ngôn ngữ Truy vấn Tích hợp (LINQ). LINQ là một trong những tính năng mạnh mẽ được giới thiệu lần đầu tiên trong .NET Framework 3.5. LINQ có thể được sử dụng với C# hoặc Visual Basic để truy vấn các nguồn dữ liệu khác nhau.
Các tính năng chính của EF Một số tính năng chính của EF như sau:
- ORM: EF cho phép các nhà phát triển làm việc với dữ liệu dưới dạng đối tượng .NET kiểu mạnh mẽ. Nó tự động ánh xạ các đối tượng này với các bảng cơ sở dữ liệu tương ứng. Sự trừu tượng này làm cho việc tương tác với cơ sở dữ liệu dễ dàng hơn bằng các mô hình lập trình hướng đối tượng quen thuộc.
- Độc lập cơ sở dữ liệu: Entity Framework hỗ trợ các hệ cơ sở dữ liệu khác nhau, bao gồm Microsoft SQL Server, MySQL, PostgreSQL, và nhiều hơn nữa. Điều này cho phép lập trình không phụ thuộc vào cơ sở dữ liệu, thuận tiện cho việc chuyển đổi cơ sở dữ liệu hoặc hỗ trợ đa cơ sở dữ liệu trong các ứng dụng.
- Các phương pháp Tiếp cận Cơ sở dữ liệu Theo Mã và Theo Cơ sở Dữ liệu: EF hỗ trợ cả hai phương pháp phát triển Theo Mã và Theo Cơ sở Dữ liệu. Trong Theo Mã, các nhà phát triển xác định mô hình dữ liệu bằng các lớp C# hoặc VB.NET. Cơ sở dữ liệu được tự động tạo ra dựa trên các lớp này. Trong Theo Cơ sở Dữ liệu, mô hình cơ sở dữ liệu được xác định trước, sau đó EF tạo ra các lớp .NET tương ứng.
- Tích hợp LINQ: Entity Framework tích hợp mượt mà với LINQ. Nó cho phép các nhà phát triển viết các truy vấn đối với mô hình dữ liệu bằng cú pháp kiểu mạnh mẽ. Điều này nâng cao tính đọc mã và tính bảo trì của mã.
- Theo Dõi Thay Đổi: EF tự động theo dõi các thay đổi được thực hiện đối với các đối tượng. Nó có thể tạo ra các câu lệnh SQL phù hợp để cập nhật cơ sở dữ liệu một cách tương ứng. Điều này đơn giản hóa quá trình lưu các thay đổi vào cơ sở dữ liệu.
- Lazy Loading và Eager Loading: EF hỗ trợ lazy loading, có nghĩa là dữ liệu liên quan được tải từ cơ sở dữ liệu chỉ khi được truy cập. Nó cũng hỗ trợ eager loading, trong đó các nhà phát triển có thể chỉ định trước dữ liệu liên quan nào sẽ được tải cùng với thực thể chính.
- Migrations: Entity Framework bao gồm tính năng migration giúp quản lý các thay đổi trong schema của cơ sở dữ liệu theo thời gian. Migrations cho phép các nhà phát triển tiến hóa schema cơ sở dữ liệu cùng với mã nguồn của ứng dụng.
Hình bên dưới mô tả vị trí thực sự của Entity Framework trong một ứng dụng đa tầng ASP.NET.
Kiến trúc của Entity Framework
Hình bên dưới thể hiện tổng thể kiến trúc của EF.
EDM bao gồm ba phần chính như sau:
- Mô hình Khái niệm (Conceptual Model): Mô hình khái niệm bao gồm các lớp mô hình và các mối quan hệ của chúng. Nó không liên quan đến thiết kế bảng cơ sở dữ liệu.
- Ánh xạ (Mapping): Ánh xạ là cách mà mô hình lưu trữ được ánh xạ với mô hình khái niệm.
- Mô hình Lưu trữ (Storage Model): Mô hình lưu trữ là mô hình thiết kế cơ sở dữ liệu bao gồm các bảng, thủ tục lưu trữ, chế độ xem, khóa và mối quan hệ của chúng.
LINQ-to-Entities
LINQ là một bộ sưu tập các phương thức mở rộng cho các lớp thực thi các giao diện IEnumerable và IQueryable. LINQ-to-Entities (L2E) tạo ra các truy vấn cho mô hình đối tượng. Các truy vấn này trả về các thực thể được mô tả trong mô hình khái niệm.
Entity SQL
Entity SQL là một ngôn ngữ truy vấn khác cho EF 6, tương tự như L2E.
Dịch vụ Đối tượng
Dịch vụ đối tượng là điểm nhập chính để lấy thông tin từ cơ sở dữ liệu và trả về chúng. Nó quản lý việc dịch thông tin từ nhà cung cấp dữ liệu khách hàng thực thể sang cấu trúc đối tượng thực thể.
Entity Client Data Provider
Nhà cung cấp dữ liệu khách hàng thực thể chuyển đổi các truy vấn L2E hoặc Entity SQL thành truy vấn SQL để cơ sở dữ liệu có thể hiểu được. Nó tương tác với nhà cung cấp dữ liệu ADO.NET, lấy dữ liệu từ cơ sở dữ liệu.
ADO.NET Data Provider
Nhà cung cấp dữ liệu ADO.NET tương tác với cơ sở dữ liệu bằng cách sử dụng ADO.NET.
Làm thế nào Entity Framework hoạt động?
EF có khả năng ánh xạ schema cơ sở dữ liệu với các lớp thực thể miền. Nó diễn giải và thực hiện các truy vấn LINQ thành SQL. Nó cũng theo dõi các thay đổi được thực hiện trên các thực thể và lưu các thay đổi vào cơ sở dữ liệu. Các bước sau mô tả cách EF hoạt động trong một ứng dụng:
Phương pháp Thiết kế trong Entity Framework
EF cung cấp ba phương pháp để xây dựng một mô hình thực thể. Mỗi phương pháp có ưu điểm và nhược điểm riêng. EF hỗ trợ ba phương pháp thiết kế là code-first, model-first và database-first. Mỗi phương pháp này đều có các ứng dụng của riêng chúng.
Phương pháp Code-First
Với phương pháp Code-First, cơ sở dữ liệu được tạo ra từ các lớp thực thể. Không cần thiết kế Mô hình. Khi các lớp thực thể đã sẵn sàng sử dụng đối tượng DbContext, cơ sở dữ liệu được tạo ra dựa trên thực thể và mối quan hệ giữa chúng. Trong phương pháp này, các thực thể được gọi là Plain Old CLR Objects (POCO). Code-First bao gồm các lớp miền. Các lớp miền là các mục của miền kinh doanh. EF có một ngữ cảnh (context), quản lý tương tác giữa các lớp và cơ sở dữ liệu. Code-First thêm một công cụ xây dựng mô hình, nó xem xét các lớp được quản lý bởi ngữ cảnh. Nó sử dụng một tập các quy tắc để xác định mối quan hệ giữa các lớp, xác định một mô hình và ánh xạ mô hình đó vào cơ sở dữ liệu. Nó cũng xác định cách mô hình đó nên được ánh xạ vào cơ sở dữ liệu. Code-First cũng có thể cập nhật cơ sở dữ liệu bằng một tính năng gọi là Code-First migration.
Phương pháp Model-First:
Thiết kế EF được sử dụng cho phương pháp Model-First. Sử dụng phương pháp này, người dùng có thể xây dựng các mô hình thực thể và mối quan hệ giữa chúng. Cơ sở dữ liệu được tạo dựa trên các mô hình này, tùy thuộc vào mối quan hệ của chúng. Model-First phù hợp cho các dự án mới nơi cơ sở dữ liệu chưa được tạo ra. Mô hình được thiết kế trước đầu tiên trong một thiết kế EF, sau đó truy vấn SQL được tạo ra. Điều này, lần lượt, tạo ra một cấu trúc cơ sở dữ liệu phù hợp với mô hình, và SQL được thực thi để tạo ra cấu trúc trong cơ sở dữ liệu. Tệp EDMX lưu mô hình, có thể được sửa đổi và hiển thị trong Thiết kế EF. Các lớp được tạo từ tệp EDMX và người dùng có thể tương tác với các lớp này trong một ứng dụng.
Phương pháp Database-First:
Sử dụng phương pháp Database-First, mô hình hoặc thực thể được tạo ra dựa trên cơ sở dữ liệu hiện tại. Cơ sở dữ liệu được thiết kế trước khi có bất kỳ mã nào được tạo ra. Phương pháp Database-First được khuyến khích cho các dự án nơi cơ sở dữ liệu đã tồn tại, đặc biệt là cho các ứng dụng lớn với dữ liệu phong phú. Trong một số tình huống, mối quan hệ, quy tắc liên kết và quy ước đặt tên có thể không phù hợp với sở thích của người dùng. Trong những trường hợp như vậy, phương pháp Code-First được khuyến khích.
Hoạt động Cơ sở dữ liệu trong Entity Framework
EF là một công cụ ORM (Object-Relational Mapping) được lên kế hoạch và thực thi tốt. Nó có sẵn với .NET Framework và đã có vài năm ổn định và phát triển tính năng. Là một ORM, EF giảm thiểu sự khác biệt giữa thế giới hướng đối tượng và quan hệ. Nhà phát triển có thể viết ứng dụng tương tác với dữ liệu có mặt trong các cơ sở dữ liệu quan hệ bằng cách sử dụng các đối tượng .NET có kiểu. Yêu cầu cho một phần lớn dữ liệu “thiết kế” đã được thực hiện trước đây, hiện nay đã được loại bỏ. EF thực hiện khả năng ánh xạ phong phú, bao gồm việc hỗ trợ cho Mối quan hệ một-một, mối quan hệ một-nhiều và mối quan hệ nhiều-nhiều Kế thừa – bảng cho mỗi loại, bảng cho lớp cụ thể và bảng cho phân cấp Lưu trữ thủ tục Loại phức tạp
Kết nối đến Cơ sở dữ liệu và Tạo Mô hình Dữ liệu Thực thể
Dưới đây là các bước để kết nối đến Cơ sở dữ liệu Azure SQL từ Entity Framework:
Bước 1: Tạo một ứng dụng ASP.NET MVC mới.
Bước 2: Nhấp chuột phải vào tên dự án và chọn Thêm từ menu ngữ cảnh.
Bước 3: Chọn Thêm Mục Mới từ menu ngữ cảnh con.
Bước 4: Chọn Mô hình Dữ liệu Thực thể ADO.NET từ cửa sổ Thêm Mục Mới.
Bước 5: Chọn Mẫu Dữ liệu Thực thể ADO.NET từ danh sách mẫu và đặt tên là StudentDBModel.
Bước 6: Nhấp vào Create. Điều này sẽ hiển thị Trình hướng dẫn Mô hình Dữ liệu Thực thể, như được hiển thị trong Hình bên dưới.
Bước 7: Chọn tùy chọn Thiết kế EF từ cơ sở dữ liệu và nhấp vào Next, sẽ hiển thị tùy chọn Kết nối cơ sở dữ liệu.
Bước 8: Nhấp vào New Connection, sẽ hiển thị tùy chọn lựa chọn Nguồn dữ liệu.
Bước 9: Chọn Microsoft SQL Server từ danh sách và nhấp vào Next.
Bước 10: Trong cửa sổ Connection Properties, nhập tên máy chủ Azure Database Server vào trường Server name cùng với tên người dùng và mật khẩu phù hợp. Các thuộc tính kết nối được hiển thị trong Hình bên dưới.
Bước 11: Nhấp vào Test Connection để kiểm tra xem kết nối cơ sở dữ liệu hoạt động bình thường. Sau đó, nhấp vào OK để tiếp tục.
Bước 12: Trong cửa sổ tiếp theo, chọn Option 2 để “Include sensitive data in the connection string” và sau đó, nhấp vào Next.
Bước 13: Chọn Entity Framework 6.0 và nhấp vào Next.
Bước 14: Đảm bảo đã chọn đầy đủ các bảng cần thiết như được hiển thị trong Hình bên dưới, sau đó nhấp vào Finish.
Sơ đồ Sinh viên DBModel trên màn hình biểu thị bảng Sinh viên từ cơ sở dữ liệu, như trong Hình bên dưới.
Bạn có thể xem các mô hình dữ liệu và mã liên quan đến DbContext được tạo tự động trong Salution Explorer, như trong Hình bên dưới.
Lớp mô hình Sinh viên được tạo tự động được hiển thị trong Đoạn mã bên dưới:
public partial class Student
{
public int StudentId { get; set; }
public string StudentName { get; set; }
public string StudentEmail { get; set; }
public System.DateTime StudentJoinDate { get; set; }
}
Bước 1: Thêm Mục Với Scaffold
- Chuột phải vào thư mục
Controllers
trong dự án ASP.NET MVC của bạn. - Chọn “Add” và sau đó chọn “New Scaffolded Item”.
- Trong hộp thoại xuất hiện (
Add Scaffold
), chọn “MVC 5 Controller with views, using Entity Framework”. - Hộp thoại này yêu cầu bạn chọn lớp mô hình (
Student
) và lớp ngữ cảnh dữ liệu (StudentDBEntities
). - Đặt tên cho controller là
StudentController
.
Bước 2: Tạo Controller và Views
- Sau khi hoàn thành Bước 1, một lớp
StudentController
sẽ được tạo tự động trong thư mụcControllers
. - Các view được tạo tự động cho chức năng tạo mới, cập nhật, xóa và hiển thị dữ liệu liên quan đến mô hình
Student
. Các view này thường được đặt trong thư mụcViews/Student
.
Bước 3: Chạy Ứng Dụng
- Khởi động ứng dụng bằng cách chạy nó.
- Trong thanh địa chỉ của trình duyệt, điều hướng đến
/Student
để truy cập các view và chức năng liên quan đếnStudent
. - Bạn có thể thêm dữ liệu bằng các view được tạo tự động và thực hiện các thao tác CRUD trên đối tượng
Student
.
Ghi Chú Bổ Sung:
- Các view được tạo tự động (
Create.cshtml
,Delete.cshtml
,Details.cshtml
,Edit.cshtml
,Index.cshtml
) cung cấp giao diện người dùng để tương tác với dữ liệuStudent
. - Phương pháp này tận dụng tính năng scaffolding của ASP.NET MVC kết hợp với Entity Framework để phát triển nhanh chóng các chức năng CRUD.
Tương tự, các nhà phát triển có thể kiểm tra chức năng Chỉnh sửa (Edit) và Xóa (Delete) của ứng dụng. Ví dụ này cho thấy việc tạo một ứng dụng CRUD hoàn chỉnh bằng Entity Framework rất dễ dàng chỉ trong vài bước. Điều này cải thiện năng suất và giảm thiểu khả năng mắc lỗi vì hầu hết mã code được tạo tự động.
Truy vấn Dữ liệu bằng LINQ
Các truy vấn LINQ-to-Entities hoạt động trên bộ thực thể (các thuộc tính loại DBSet) để kết nối với thông tin trong cơ sở dữ liệu. Các nhà phát triển nên sử dụng cú pháp phương thức LINQ hoặc cú pháp truy vấn khi thực thi các truy vấn trên EDM.
Đoạn mã bên dưới miêu tả một truy vấn LINQ-to-Entities, lấy thông tin từ bảng Student trong cơ sở dữ liệu:
var query = context.Students
.Where(x => x.StudentName == "John Doe")
.FirstOrDefault<Student>();
Thêm một Bản ghi bằng DbContext
Eager loading là phương pháp trong đó một loại thực thể cụ thể cũng tải các thực thể có liên quan là một phần của truy vấn. Điều này loại bỏ nhu cầu thực hiện một truy vấn khác cho các thực thể liên quan. Sử dụng phương thức Include()
để thực hiện eager loading.
Lazy Loading trong Entity Framework
Lazy loading là quá trình trong đó một thực thể cụ thể hoặc một nhóm thực thể được tải từ cơ sở dữ liệu tự động khi thuộc tính chỉ định thực thể/thực thể được truy cập lần đầu tiên. Để thực hiện lazy loading, tạo các phiên bản của các loại proxy được kế thừa và sau đó, ghi đè các thuộc tính ảo để bao gồm cả khóa tải.
Truy vấn Phức tạp trong LINQ
Một trong những khái niệm quan trọng nhất trong LINQ-to-Entities là nó là một ngôn ngữ khai báo. Trọng tâm đặt vào việc xác định thông tin cần thiết và không phải là cách thu thập thông tin cần thiết. Tiếp cận này tăng cường tính đọc và trừu tượng hóa bằng cách cho phép các nhà phát triển tập trung hơn vào ý định của truy vấn và ít quan tâm đến chi tiết thực hiện.
Toán tử Truy vấn Chuẩn
Các toán tử truy vấn chuẩn được liệt kê trong Bảng bên dưới:
Phép Toán | Toán Tử Truy Vấn Chuẩn |
Lấy dữ liệu | Distinct, Except, Intersect, Union |
Kiểm tra tồn tại | All, Any, Contains |
Phần tử | Where, OfType |
Sắp xếp | OrderBy, OrderByDescending, ThenBy, ThenByDescending |
Nhóm hóa | GroupBy, ToLookup |
Tổng hợp | Aggregate, Average, Count, LongCount, Max, Min, Sum |
Liên kết | Concat |
Tạo dữ liệu | DefaultIfEmpty, Empty, Range, Repeat |
Kiểm tra bằng nhau | SequenceEqual |
Chiếu (Chọn) | Select, SelectMany |
Đoạn mã bên dưới miêu tả một truy vấn phức tạp trong LINQ. Nó truy vấn các bản ghi sinh viên được sắp xếp theo tên.
var orderedStudents =
from student in context.Students
orderby student.StudentName
select student;
Truy vấn này được coi là phức tạp vì nó sử dụng toán tử orderby, nhưng nó rất dễ tạo ra.