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ờ đó, 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<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>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 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

Tham khảo thêm: CSDL, SSDL, and MSL Specifications

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 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

https://yinyangit.wordpress.com

Advertisements

3 thoughts on “Tổng quan kiến trúc của Entity Framework

  1. Cho em hỏi, e đã tạo connectionStrings trong App.config rồi. Nhưng đến khi chạy đến dòng ObjectContext context = new ObjectContext(“Name=DataContext”); thì báo lỗi sau:”the specified named connection is either not found in the configuration, not intended to be used with the EntityClient provider, or not valid.”. Phải xử lý thế nào ạ? Thanks

    Trả lời

Trả lời

Mời bạn điền thông tin vào ô dưới đây hoặc kích vào một biểu tượng để đăng nhập:

WordPress.com Logo

Bạn đang bình luận bằng tài khoản WordPress.com Log Out / Thay đổi )

Twitter picture

Bạn đang bình luận bằng tài khoản Twitter Log Out / Thay đổi )

Facebook photo

Bạn đang bình luận bằng tài khoản Facebook Log Out / Thay đổi )

Google+ photo

Bạn đang bình luận bằng tài khoản Google+ Log Out / Thay đổi )

Connecting to %s