Thứ Năm, 28 tháng 6, 2012

Tổng quan kiến trúc của Entity Framework


ADO.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ờ đó, 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:
Entity Framework architecture
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 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.
-      EntityObjectComplexObject 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 và EntityReference: 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 ObjectEntity Framework Object
DatabaseObjectContext
Table, ViewEntityObject, ComplexObject
ColumnProperty
RelationshipEntityCollection, EntityReference
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:
01// …
02ObjectContext context = new ObjectContext("name=NorthwindEntities");
03
04ObjectSet products = context.CreateObjectSet();
05
06var query = from p in products
07            where p.ProductName.StartsWith("g")
08            select p;
09
10foreach (var item in query)
11{
12    Console.WriteLine("{0,-4}{1}",item.ProductID, item.ProductName);
13}
14// …
Output:
6   Grandma's Boysenberry Spread
15  Genen Shouyu
22  Gustaf's Knäckebröd
24  Guaraná Fantástica
26  Gumbär Gummibärchen
31  Gorgonzola Telino
33  Geitost
37  Gravad lax
44  Gula Malacca
56  Gnocchi di nonna Alice
69  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.
Entity Mapping Model
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ằngEntityCommand 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:
01int categoryID = 1;
02using (EntityConnection con = new EntityConnection("Name=NorthwindEntities"))
03{
04    con.Open();
05    EntityCommand cmd = con.CreateCommand();
06    cmd.CommandText = "SELECT VALUE p FROM NorthwindEntities.Products AS p WHERE p.CategoryID = @catId";
07    cmd.Parameters.AddWithValue("catId", categoryID);
08    EntityDataReader reader = cmd.ExecuteReader(CommandBehavior.SequentialAccess);
09    while (reader.Read())
10    {
11        var name = reader["ProductName"];
12        var catId=reader["CategoryID"];
13        Console.WriteLine("{0,-3}{1}",catId,name);
14    }
15    reader.Close();
16}
17// ...
Output:
CategoryID ProductName
1          Chai
1          Chang
1          Guaraná Fantástica
1          Sasquatch Ale
1          Steeleye Stout
1          Côte de Blaye
1          Chartreuse verte
1          Ipoh Coffee
1          Laughing Lumberjack Lager
1          Outback Lager
1          Rhönbräu Klosterbier
1          Lakkalikööri

Không có nhận xét nào: