Tổng quan kiến trúc của Entity Framework Entity Mapping ModelADO.NET Entity Framework là một nền tảng được sử dụng để làm việc với database thông qua cơ chế ánh xạ Object/Relational Mapping (ORM). Nhờ Entity Framework, bạn có thể truy vấn, thao tác với database gián tiếp thông qua các đối tượng lập trình. Kiến trúc của Entity Framework được minh họa như sau: Các nội dung dưới đây sẽ đi vào giải thích từng phần trong sơ đồ trên. Trong giới hạn của bài viết, tôi chỉ đi khái quát để bạn nắm được nội dung chính. Trong thực tế, bạn cũng không cần biết sâu hơn về kiến trúc bên dưới trừ những mục đích đặc biệt. Object Services Đây là các class tự động sinh ra tương ứng với mô hình dữ liệu. Các class này bao gồm: – ObjectContext đại diện cho một database. ObjectContext có chức năng quản lý các kết nối, định nghĩa mô hình dữ liệu với metadata và thao tác với database. Lớp này cũng có thể thêm vào các phương thức đại diện cho các stored procedure trong database. – ObjectSet<TEntity> là một một tập hợp các entity. Mỗi đối tượng này tương ứng với một table. Có thể lấy được các đối tượng này thông qua các property tương ứng của ObjectContext. – EntityObject, ComplexObject là các lớp tương ứng cho một dòng dữ liệu của table trong database. Khác biệt chính giữa hai loại này là ComplexObject không chứa primary key. – EntityCollection<TEntity> và EntityReference<TEntity>: là các đối tượng thể hiện mối quan hệ (relationship) giữa hai entity class. Mỗi đối tượng này có thể được truy xuất thông qua các property của entity class. Ta có bảng ánh xạ tương đương sau giữa các đối tượng trong database và EF: Database Object Entity Framework Object Database ObjectContext Table, View EntityObject, ComplexObject Column Property Relationship EntityCollection<TEntity>, EntityReference<TEntity> Ví dụ sau cho thấy cách tạo một đối tượng ObjectContext từ mô hình dữ liệu NorthwindEntities (tên của connection string được lưu trong app.config), sau đó sử dụng LINQ to Entities để lấy ra các sản phẩm (trong bảng Products) có tên bắt đầu bằng “G” và in ra màn: // …ObjectContext context = new ObjectContext("name=NorthwindEntities");ObjectSet<Product> products = context.CreateObjectSet<Product>();var query = from p in products where p.ProductName.StartsWith("g") select p;foreach (var item in query){ Console.WriteLine("{0,-4}{1}",item.ProductID, item.ProductName);}// … Output: 6 Grandma's Boysenberry Spread15 Genen Shouyu22 Gustaf's Knäckebröd24 Guaraná Fantástica26 Gumbär Gummibärchen31 Gorgonzola Telino33 Geitost37 Gravad lax44 Gula Malacca56 Gnocchi di nonna Alice69 Gudbrandsdalsost Entity Data Model Entity Data Model (EDM) là mô hình dữ liệu được mô tả thông qua các ngôn ngữ theo chuẩn XML. EDM được chia làm 3 lớp là: Conceptual, Mapping và Logical. Mỗi lớp này được định nghĩa bởi ngôn ngữ riêng theo định dạng XML: – Conceptual – Conceptual Schema Definition Language (CSDL): là ngôn ngữ định nghĩa các entity, relationship, hàm trong tập tin với phần mở rộng .csdl. Có thể tạo được các entity class (object layer). – Mapping – Mapping specification language (MSL): định nghĩa các ánh xạ giữa lớp conceptual và logical, nội dung này được lưu trong tập tin .msl. – Logical – Store Schema Definition Language (SSDL): định nghĩa mô hình lưu trữ của dữ liệu, lưu trữ trong tập tin .ssdl. Các nội dung của ba tập tin .csdl, .msl và .ssdl được lưu trữ trong cùng tập tin .edmx trong Visual Studio. Tập tin này có thể được tạo ra tự động từ database và công cụ Entity Framework Model Wizard của Visual Studio. Trong quá trình biên dịch, các tập tin .csdl, .msl và .ssdl sẽ được tạo ra dựa vào tập tin .edmx này. Note: Khi mở tập tin .edmx này, VS tự động hiển thị giao diện trực quan của nó bằng công cụ mặc định là ADO.NET Entity Data Model Designer. Để xem nội dung của tập tin này, bạn nhấn chuột phải, nhấn Open with… và chọn mục XML Editor hoặc một trình xem dưới dạng văn bản bất kì. EntityClient Data Provider EntityClient là một data provider mới của ADO.NET dùng để truy xuất đến database. Được xây dựng bên trên các ADO.NET data provider cơ bản, EntityClient không truy xuất trực tiếp dữ liệu mà thông qua các data provider khác dựa vào các thông tin dữ liệu từ Entity Data Model. EntityClient cũng bao gồm các lớp giống như các ADO.NET data provider khác và tên lớp được đặt với tiền tố Entity. Ví dụ bạn có thể tạo kết nối bằng EntityConnection, tạo các câu truy vấn bằng EntityCommand và đọc kết quả bằng EntityDataReader. Một điểm khác biệt với các data provider khác là EntityClient sử dụng Entity SQL để truy vấn dữ liệu. Các lệnh Entity SQL sẽ được chuyển thành một cấu trúc lệnh dạng cây (command tree) và chuyển xuống cho các data provider khác. Ví dụ sau sử dụng EntityClient để tạo kết nối, tạo đối tượng EntityCommand và sử dụng tham số để lấy các sản phẩm có CategoryID là 1: int categoryID = 1;using (EntityConnection con = new EntityConnection("Name=NorthwindEntities")){ con.Open(); EntityCommand cmd = con.CreateCommand(); cmd.CommandText = "SELECT VALUE p FROM NorthwindEntities.Products AS p WHERE p.CategoryID = @catId"; cmd.Parameters.AddWithValue("catId", categoryID); EntityDataReader reader = cmd.ExecuteReader(CommandBehavior.SequentialAccess); while (reader.Read()) { var name = reader["ProductName"]; var catId=reader["CategoryID"]; Console.WriteLine("{0,-3}{1}",catId,name); } reader.Close();}// ... Output: CategoryID ProductName1 Chai1 Chang1 Guaraná Fantástica1 Sasquatch Ale1 Steeleye Stout1 Côte de Blaye1 Chartreuse verte1 Ipoh Coffee1 Laughing Lumberjack Lager1 Outback Lager1 Rhönbräu Klosterbier1 Lakkalikööri Tags: