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

Thảo luận trong 'C#.NET, Windows Form' bắt đầu bởi nhatlectv, 7/5/16.

  1. nhatlectv

    nhatlectv Stanford - Nâng tầm tri thức Thành viên BQT

    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:

    [​IMG]

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

    [​IMG]

    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
     

Chia sẻ trang này