Thiết kế Entity Data Model – Part 1: Database First

Entity Framework design approachesLà thành phần trung gian giữa ứng dụng và database, Entity Data Model (EDM) giúp tạo liên kết và mô tả giữa nguồn dữ liệu vật lý và các đối tượng bussiness (hay object layer) trong ứng dụng. Dựa vào sự lựa chọn thành phần nào sẽ được tạo ra trước, một ứng dụng Entity Framework (EF) có thể sử dụng 1 trong 3 cách tiếp cận: Database First, Model First và Code First.

Các sơ đồ dưới đây minh hoạt mối quan hệ và thứ tự tạo ra giữa các thành phần dữ liệu trong ứng dụng của Entity Framework. Phần Model tương ứng với tập tin .edmx, Code tương ứng với tập tin .cs (hoặc .vb nếu bạn dùng VB.NET).

Entity Framework design approaches

Note: Bạn có thể nhận thấy rằng phần Model luôn được theo sau bởi Code, điều này là nhờ công cụ Entity Data Model Designer trong Visual tự động tạo ra code tương ứng mỗi khi bạn thực hiện chỉnh sửa tập tin .edmx.

Database First:

Đây là cách thông thường và được hỗ trợ từ phiên bản EF 1 trong Visual Studio 2008.

EF sẽ tự động tạo ra data model và các class (object layer) cho bạn từ database có sẵn thông qua công cụ Entity Data Model Wizard. Bạn có thể thay đổi data model và cập nhật lại vào database. Đây là cách tiếp cận phổ biến vì cách thực hiện đơn giản, nhanh chóng

Model First:

Hướng tiếp cận này được bổ sung từ phiên bản EF 4 trong Visual 2010.

Bạn có thể tạo một data model rỗng bằng công cụ Entity Data Model Designer, khi đó object layer cũng tự động được sinh ra. Sau khi đã hoàn thành việc thiết kế, bạn có thể sử dụng chức năng Generate Database from Model để tạo ra các mã DDL (data definition language) dựa trên mã SSDL (Store Schema Definition Language). Các mã DDL này sẽ được thực thi và lưu thành tập tin .sql.

Code First:

Với phiên bản EF 4 bạn cần phải cài thêm thư viện EF Feature CTP (Community Technology Preview) để sử dụng. Tuy nhiên tính năng này đã được tích hợp vào trong phiên bản EF 4.1 và với phiên bản VS 2010 hiện tại thì bạn cần phải download để cài đặt thủ công.

Hướng tiếp cận này bỏ qua phần Model (.edmx), bạn có thể thiết kế các class tương ứng với các table của database mà bạn cần làm việc hoặc muốn tạo ra. Với hướng tiếp cận này, bạn sẽ sử dụng class DbContext thay vì ObjectContext để thao tác với database. Việc sử dụng Code First đòi hỏi bạn phải thực hiện các công việc một cách thủ công nhưng bù lại nó linh hoạt và được sử dụng rất phổ biến.

Tạo EDM theo hướng Database First (Step by Step)

Phần này bạn sẽ được hướng dẫn cách tạo một Entity Data Model từng bước dựa vào công cụ Entity Data Model Designer. Dữ liệu nguồn được sử dụng trong ví dụ là Northwind (download tại http://www.microsoft.com/download/en/details.aspx?id=23654).

Bước 1: Tạo dự án mới với kiểu là Console Application.

Bước 2: Nhấn Add New Item (Ctrl+Shift+A) trên thanh công cụ và chọn mục ADO.NET Entity Data Model trong hộp thoại hiện ra. Đặt tên mục sắp thêm vào là  NorthwindModel với phần mở rộng mặc định là .edmx. Nhấn Add.

Insert ADO,NET Entity Data Model

Bước 3: Cửa sổ Entity Data Model Wizard hiện ra. Bước này để xác định bạn sẽ tạo model từ database có sẵn hoặc một model rỗng. Bạn để lựa chọn mặc định là Generate from database và nhấn Next.

Entity Data Model Wizard - Step 1

Bước 4: Bước này bạn cần chọn database nào sẽ sử dụng. Chuỗi kết nối sẽ tự động được sinh trong phần Entity connection string. Với tùy chọn Save entity connection settings in App.Config, chuỗi kết nối này sẽ tự động được thêm vào tập tin App.Config, nhờ đó bạn không cần nhớ chuỗi kết nối mà chỉ cần nhớ tên của kết nối là NorthwindEntities.

Entity Data Model Wizard - Step 2

Trong trường hợp bạn chưa có sẵn kết nối với database nào, hãy nhấn nút New Connection… Các kết nối mà bạn đã tạo sẽ hiện ra trong cửa sổ Server Explorer. Nhấn Next.

Bước 5: Lựa chọn các table, view và stored procedure bạn muốn sử dụng. Trong ví dụ này, tôi chỉ sử dụng ba table là Orders, Order Details và Products.

Entity Data Model Wizard - Step 3

Sau khi nhấn Finish, tập tin NorthwindModel.edmx sẽ được thêm vào Solution Explorer. Đây là tập tin có dạng .xml và được mở với trình mặc định ADO.NET Entity Data Model Designer với giao diện trực quan như hình dưới. Nếu muốn coi nội dung của tập tin này dưới dạng văn bản .xml, bạn nhấn chuột phải vào tập tin trong Solution Explorer > Open With… và chọn XML Editor. Bạn có thể coi các thông tin đầy đủ của model trong cửa sổ Model Browser và Mapping Details.

Entity Data Model Designer

Ngoài tập tin .edmx trên, một tập tin khác cũng được tự động tạo ra là NorthwindModel.Designer.cs. Tập tin này chứa code C# được sinh ra cho các class bạn sẽ sử dụng trực tiếp khi lập trình. Các class này được gọi là Object Layer (là phần Object Services trong kiến trúc của Entity Framework).

Khảo sát tập tin này, bạn sẽ thấy nó bao gồm các class là: NorthwindEntities, Order, Order_Detail và Product. Trong đó, class  NorthwindEntities chính là class thừa kế từ ObjectContext mà bạn cần sử dụng để tạo kết nối và thao tác với database.

Kiểm tra kết quả với LINQ to Entities

Việc sử dụng LINQ to Entities rất đơn giản, tương tự như LINQ to SQL. Bạn chỉ cần làm việc với các class của object layer và property của chúng. Ví dụ sau in ra các sản phẩm có CategoryID là 1 trong bảng Products:

// ...
NorthwindEntities db = new NorthwindEntities();

var query = from p in db.Products
            where p.CategoryID == 1
            select p.ProductName;

foreach (var item in query)
{
    Console.WriteLine(item);
}
// ...

Output:

Chai
Chang
Guaraná Fantástica
Sasquatch Ale
Steeleye Stout
Côte de Blaye
Chartreuse verte
Ipoh Coffee
Laughing Lumberjack Lager
Outback Lager
Rhönbräu Klosterbier
Lakkalikööri

————————————-
https://yinyangit.wordpress.com

Bài liên quan

20 thoughts on “Thiết kế Entity Data Model – Part 1: Database First

  1. Chào anh, em làm bằng linq to sql thì nó cũng ra kết quả y chang. Vậy anh cho em hỏi làm Entity Framwork này làm gì nhỉ vì mình làm bằng linq to sql thì cũng vậy. Và rõ ràng là anh cũng viết trong bài viết này là “Việc sử dụng LINQ to Entities rất đơn giản, tương tự như LINQ to SQL” nằm trong phần “Kiểm tra kết quả với LINQ to Entities”.
    Anh có thể giải thích rõ hơn được không.

    Phản hồi
    • Bạn thử tạo một ví dụ console làm một vài phép tính đơn giản trong VS 2003, bạn sẽ thấy rằng nó cho ra kết quả y chang nếu như làm trong VS 2010. Câu hỏi của bạn có lẽ là do mình thiếu phần so sánh giữa LINQ to SQL và EF (LINQ to Entities). Cụ thể có 3 đặc điểm khác nhau cơ bản giữa LINQ2SQL và EF.
      – Nếu đọc phần giới thiệu về LINQ2SQL, bạn sẽ thấy rằng nó được tạo ra chỉ để làm việc với Sql Server. Còn EF với EntityClient có thể làm việc được với nhiều loại DB thông qua ADO.NET.
      – EF hỗ trợ 3 mô hình: Database First, Model First, Code First, trong khi LINQ2SQL chỉ có Database First.
      – EF hỗ trợ nhiều loại relationship hơn LINQ2SQL.

      Và 1 vấn đề quan trọng không kém là lập trình viên cần phải đi theo số đông và những công nghệ mới.

      Phản hồi
  2. Pingback: Thiết kế Entity Data Model – Part 2: Model First | ++JohnyMinh thân chào các bạn! Chúc các bạn có một ngày vui vẽ++ ^ j ^ .M

  3. Yin Yang ơi mình có 1 chút thắc mắc về EF như sau mong bạn giải đáp dùm mình.
    Mình đang code SilverlightApp truy xuất dữ liệu qua DomainService sử dụng EF. Có vấn đề như sau:
    ————————————
    DomainContext _service = new DomainContext();
    _service.Load(_service.GetDanhsachSVQuery()); // Load dữ liệu vào Entity
    dataGrid1.ItemsSource = _service.DSSVs; //DSSVs là Entities đc tạo ra từ bảng DSSV trong DB. Mình gọi hàm này thì dataGrid1 có dữ liệu chính xác đc lấy từ DataBase
    var recs = from item in _service.DSSVs select new{item.MaSV}
    dataGrid2.ItemsSource = recs;// Nhưng khi mình gọi hàm này thì dataGrid2 kô hề có dữ liệu. Khi mình test thì thấy trong _service.DSSVs lại kô có kết quả gì cả. Bạn có thể giải thik cho mình đc kô. Và làm thế nào để mình lấy danh sách _service.DSSVs để đổ vào 1 List khác như List

    p/s: Mình cũng đang làm về phần AutoRefresh dữ liệu trong DataGrid của Silverlight nhưng chưa thu đc kết quả gì khả quan nếu bạn có phần hướng dẫn nào thì có thể gửi cho mình 1 đoạn Code để mình thử tìm hiểu xem:D
    email:truongblt@gmail.com hoặc nhocblt.4everluv@yahoo.com.vn
    Rất cám ơn các bài viết của bạn đã giúp mình rất nhiều trong việc học lập trình

    Phản hồi
  4. Pingback: WPF: Sử dụng Entity framework Code first với CSDL SQL Server có sẵn | Blog của Lê Văn Luật

  5. Pingback: WPF: Sử dụng Entity framework Code first với CSDL SQL Server có sẵn | vuongquyen

  6. Ying ơi, giúp mình nhé, lúc mình ADD csdl vào nhưng mở file designer trong C# ra thì ko thấy gì cả, chỉ có thông báo ( chữ màu xanh lá ) :
    // Default code generation is disabled for model ‘C:\Users\TikTak\Documents\Visual Studio 2012\Projects\ExampleEntity – Copy\ExampleEntity\Model3.edmx’.
    // To enable default code generation, change the value of the ‘Code Generation Strategy’ designer
    // property to an alternate value. This property is available in the Properties Window when the model is
    // open in the designer.

    mình ko biết làm sao ?

    Phản hồi
  7. Anh cho em hỏi, server em xài là 2000 nên khi dùng database first thì thông báo yêu cầu từ 2005 trở lên(server này em không tự ý đổi được 😦 ), em dùng code first kết nối vào sqlexpress của local thì thông báo “CREATE DATABASE permission denied in database ‘master’. Dù em dùng windows Authentication nhưng vẫn không được, 2 ngày rồi em vẫn chưa kết nối được đến CSQL, mong anh giúp đỡ

    Phản hồi
  8. anh ơi cho em hỏi là, e dung code first để lam database,nhưng ví dụ e đang có 2 bảng rồi, thì e tạo thêm 1 class nữa để thêm 1 bảng nữa,nhưng nó ko cập nhật bảng đó vào csdl,làm cách nào để cập nhật tiếp thêm 1 bảng nữa vậy a

    Phản hồ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