Thiết kế Entity Data Model – Part 2: Model First

Entity Data Model DesignerTiếp theo phần 1 về Databate First, bài viết này sẽ trình bày về cách tạo Entity Data Model (EDM) theo hướng Model First. Dựa vào tính năng này, bạn có thể thiết kế được một database thông qua giao diện trực quan của Entity Data Model Designer trong Visual Studio.

Thiết kế Entity Data Model

Việc thiết kế EDM theo hướng Model First có thể coi là một bài tập tạo một EDM thủ công bằng công cụ Entity Data Model Designer. Việc thiết kế bằng công cụ không khó nếu như bạn đã quen thuộc với Visual Studio và từng làm việc các loại database.

Đầu tiên, bạn cần thêm một phần tử ADO.NET Entity Data Model vào dự án (Add New Item…). Trong cửa sổ Entity Data Model Wizard hiện ra, chọn Empty model, sau đó nhấn Finish.

Create Empty Entity Data Model

 

Sau khi thêm vào, tập tin .edmx sẽ được thêm vào trong Solution Explorer và tự động được mở ra với công cụ Entity Data Model Designer. Tuy nhiên bởi vì là một model rỗng, bạn cần dùng các mục trong Toolbox hoặc menu ngữ cảnh để tạo ra các entity và mối liên hệ giữa chúng.

Trong ví dụ này tôi tạo ba entity là: Person, AuthorBook. Ngoài ra tôi tạo thêm một complex type là PersonInfo với hai property là Address và Phone đều có kiểu dữ liệu là String.

Nếu bạn cảm thấy khó khăn khi làm quen với Entity Data Model Designer, hãy đọc một số hướng dẫn dưới đây.

–      Tạo một complex type bằng cách nhấn phải vào vùng trống chọn Add>Complex Type. Một mục mới sẽ được thêm vào trong mục Complex Types ở cửa sổ Model Browser. Hãy đặt tên cho complex type này và nhấn phải vào đó thể thêm các property cần thiết.

Model Browser - Complex Type

–      Để thêm một property vào entity, nhấn phải vào entity chọn Add>Scalar Property hoặc Add>Complex Property. Sau đó bạn có thể chọn kiểu dữ liệu trong cửa sổ Properties.

–      Tạo mối liên hệ (relationship) giữa các entity bằng cách dùng Association trên Toolbox hoặc nhấn phải vào entity chọn Add>Association. Sau khi tạo, hai navigation property tương ứng sẽ xuất hiện trong mỗi entity. Các navigation property này giúp cho các đối tượng entity có tham chiếu đến nhau dễ dàng hơn trong quá trình sử dụng.

–      Việc tạo một mối liên hệ thừa kế (inheritance) tương tự như tạo association. Khi tạo một thừa kế (inheritance) giữa hai entity, entity con sẽ được thừa hưởng tất cả property của entity cha. Điều này tương ứng với mối quan hệ 1-1 trong database.

Sau khi tạo, tôi có được một model như sau:

Entity Data Model Designer

Tạo database từ Entity Data Model

Sau khi hoàn thành việc thiết kế model (tập tin .edmx), bạn hãy nhấn phải vào vùng trống của Entity Data Model Designer và chọn Generate Database from Model… Trong cửa sổ Generate Database Wizard hiện ra, bạn có thể lựa chọn một database có sẵn để thêm các table mới vào. Tuy nhiên tôi sẽ tạo ra một database mới bằng cách nhấn vào New Connection. Trong cửa sổ Connection Properties, tôi sử dụng Data source là Microsoft SQL Server, chọn Server name và nhập database name bất kì, ở đây tôi đặt là Test. Nhấn OK.

Create New  Database Connection

Bởi vì server tôi chọn chưa có database Test, một hộp thoại xác nhận hiện ra yêu cầu tạo database này. Hãy nhấn OK để tiếp tục.

Trong cửa sổ wizard, nhấn Next và bạn sẽ thấy các mã DDL sẽ được tạo ra và lưu trong tập tin Model1.edmx.sql. Nhấn Finish và tập tin .sql này sẽ được mở ra. Bạn có thể thấy rằng các tên table sắp được tạo ra được tự động chuyển về dạng số nhiều dựa vào tên của entity. Trong trường hợp này là entity Person sẽ được chuyển thành table People.

EF - Generate Database Wizard - DDL

 

Bạn có thể chỉnh sửa lại nội dung để phù hợp hơn. Tuy nhiên, bạn cũng cần phải sửa lại các ánh xạ trong tập tin .edmx cho phù hợp. Nếu không cần thiết, bạn hãy bỏ qua việc chỉnh sửa này.

Ví dụ tôi sửa tên các field của table People là Info_Address thành Address và Info_Phone thành Phone. Sau đó mở tập tin .edmx với XML Editor và chỉnh sửa lại các tên này tương ứng như trên. Có thể sử dụng chức năng Find and Replace.

Sau khi chỉnh sửa, hãy kiểm tra lại nội dung của nó bằng cách dùng chức năng Validate SQL Syntax. Nếu chưa kết nối, cửa sổ Connect to Database Engine của SQL Server sẽ hiện ra để yêu cầu kết nối. Nhấn Connect để tiếp tục.

Entity Framework - Content of DDL File

Sau khi kết nối, các mã sql của tập tin này sẽ được thực thi bằng cách nhấn phải vào cửa sổ soạn thảo hiện tại chọn Execute SQL. Nếu thấy thông điệp “Command(s) completed successfully.” hiện ra ở cửa sổ bên dưới là đã thành công.

Bạn có thể mở SQL Management Studio lên để kiểm tra database này, mô hình của database này có dạng như hình dưới.

SQL Server Management Studio 2008

Kiểm tra kết quả: Thêm dữ liệu vào table People

Mở tập tin App.Config bạn có thể thấy chuỗi kết nối được thêm vào với tên mặc định trùng với tên của lớp context là Model1Container (thừa kế từ ObjectContext). Ta sẽ tạo một thể hiện của Model1Container để thêm một đối tượng Author vào database.

Vì Author được thừa kế từ Person, Model1Container chỉ cung cấp duy nhất một phương thức

static void Main(string[] args)
{
    Model1Container db = new Model1Container();

    PersonInfo info=new PersonInfo(){ Address="123 HCM City", Phone="00-123-456"};

    Author a = new Author() {Name="Yin Yang", Email = "yinyang.itATgmailDOTcom" };
    a.Info = info;
    db.AddToPeople(a);
    db.SaveChanges();

    Console.WriteLine("Entity has been inserted to the database.");
    Console.Read();
}

Mặc dù chỉ thêm một đối tượng Author, nhưng dữ liệu sẽ được phân chia vào hai table là People và People_Author trong database. Có thể coi việc tạo hai entity Person và Author là không cần thiết và có thể nhập lại thành một. Việc tách ra hai entity thế này chỉ cần khi bạn có nhiều entity cùng thừa kế. Kết quả trong database sau khi chạy ví dụ trên:

Peope and Author Tables

https://yinyangit.wordpress.com

Bài liên quan:

6 thoughts on “Thiết kế Entity Data Model – Part 2: Model First

  1. Chào anh Yin Yang, anh em em hỏi 2 vấn đề này được không.
    – Ở Mô hình Model First này nếu mình thay đổi model như thêm entity, thêm relationship giữa các entity thì mình sẽ khắc phục bằng cách nào để update lại database mà không làm mất dữ liệu sẵn có trong database ? Em đã sửa lại file Script sau khi thực hiện lệnh generate database from model ( bằng cách xóa đi các dòng lệnh xóa bảng cũ và re-creaty lại table, relationship) nhưng thầy em nói như thế vẫn chưa đúng yêu cầu do đây là cách làm thủ công, thầy nói mình có thể can thiệp vào code để không bị mất dữ liệu khi sửa đổi model, em có tìm hiểu thêm trên các site nước ngoài thì câu trả lời là migration script nhưng phiên bản EF frameword 4.0 lại chưa hỗ trợ tính năng này 😦
    – Thứ hai là quan hệ many to many. Em có hai bảng là SinhViens và MonHocs, quan hệ giữa 2 bảng này là many-to-many, khi tạo database từ model nó sinh ra 1 bảng trung gian và lấy 2 khóa chính của 2 bảng SinhViens (PK là MSSV) và MonHocs (PK: MaMonHoc) làm khóa, em đã có thể chèn dữ liệu vào quan hệ này theo ví dụ trên mạng, nhưng vẫn không tìm thấy cơ chế mapping khi chèn dữ liệu vào table này như thế nào ( trong file model1.edmx không xuất hiện do bảng trung gian này k phải là một entity, do đó trong file edmx không thể hiện nó ra được ) . Anh YinYang có thể cho em biết phần mapping này nằm ở đâu không
    Cảm ơn anh
    Đây là Project Demo kèm theo CSDL nếu anh cần xem qua ạ : https://docs.google.com/file/d/0Bw7H7PZsJL82bHNpMVM3WU9BM2M/edit?usp=sharing

    Trả lời
  2. 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

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

  4. Pingback: Thiết kế Entity Data Model – Part 2: Model First | quanglnt's blog

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