Search This Blog

Wednesday, July 6, 2016

Sử dụng ADO.NET Entity Framework tương tác với Database - Mô hình Database First

ADO.NET Entity Framework là một mô hình hay nền tảng ORM (Object Relational Mapper) ánh xạ trực tiếp với database để tạo ra những mô hình dữ liệu quan hệ...và cung cấp những cơ chế giúp ta có thể tương tác, khai thác dữ liệu hiệu quả, dễ dàng hơn.

Có ba cách để chúng ta sử dụng Entity Framework tương tác với database: Database First, Code First và Model First. Trong bài viết này Kiên sẽ giới thiệu đến các bạn cách sử dụng mô hình Database First trong Entity Framework để tạo mô hình dữ liệu quan hệ với database.

Vậy Entity Framework - Database First là gì?

Nếu bạn đã có một database, Entity Framework có thể tự động tạo ra một mô hình dữ liệu bao gồm các lớp và các thuộc tính tương ứng với cơ sở dữ liệu hiện có đối tượng như table và column thông qua cơ chế kéo thả khá dễ dàng. Các thông tin về cấu trúc database được lưu trữ trong một tập tin .edmx. Ngoài ra Entity Framework cung cấp một giao diện đồ họa khá trực quan mà bạn có thể sử dụng để hiển thị và chỉnh sửa file .edmx.

Chúng ta hãy thử bắt đầu với ví dụ đơn giản nhất.

BƯỚC ĐẦU TIÊN: Sử dụng Entity Framework để tạo mapping từ database


- Ta tạo một database FatoryPattern có một table [employee] đơn giản như hình 1
(hình 1)

- Mở Visual Studio 2013 (là phiên bản mà Kiên đang sử dụng, các bạn có thể sử dụng bất kì phiên bản nào tùy ý). Tạo mới một project Window Forms Application có tên FactoryPattern_Example như hình 2.
(hình 2)

- Click phải vào project -> Add -> New Item như hình 3.
(hình 3)

- Trong cửa sổ Add New Item, ta chọn ADO.NET Entity Data Model. Nhập tên trong ô Name FactoryModel, sau đó nhấn nút Add như hình 4.
(hình 4)

- Trong cửa sổ Entity Data Model Wizard - Choose Model Contents, chọn EF Designer from database, nhấn nút Next như hình 5.
(hình 5)

- Trong trường hợp chưa có connection được tạo sẵn, ta click vào nút New Connection. Trong cửa sổ Connection Properties hiện ra sau đó, ta nhập các thông tin đăng nhập vào MSSQL, chọn database, sau đó nhấn OK để hoàn thành thao tác như hình 6.
(hình 6)

- Quay lại cửa sổ Entity Data Model Wizard - Choose Your Data Connection, chúng ta sẽ thấy đã có một connection được tạo ra. Trong ô Save connection settings in App.Config as, chúng ta nhập FactoryPatternEntities, sau đó nhấn Next như hình 7.
(hình 7)

- Trong cửa sổ Entity Data Model Wizard - Choose Your Database Objects and Settings, chúng ta check chọn tất cả Table. Trong ô Model Namespace ta nhập FactoryPatternModel, sau đó nhấn Finish như hình 8 để hoàn tất việc tạo mapping đến database bằng Entity Framework Database First.
(hình 8)

- Hình 9 cho ta thấy diagram được sinh ra. Build Solution (F6) để kiểm tra có lỗi hay không.
(hình 9)

- Hình 10 là nội dụng của file App.config cho ta thấy một số thông tin cấu hình để kết nối đến database. Hãy chú ý đến key <add name="FactoryPatternEntities"> nằm trong <connectionStrings>...</connectionString>. Nó rất quan trọng trong việc tạo connection của chúng ta mà một lát nữa chúng ta sẽ quay lại với nó.
(hình 10)
 <?xml version="1.0" encoding="utf-8"?>  
 <configuration>  
  <configSections>  
   <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->  
   <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />  
  </configSections>  
  <startup>  
   <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />  
  </startup>  
  <connectionStrings>  
   <add name="FactoryPatternEntities"   
      connectionString="metadata=res://*/FactoryModel.csdl|res://*/FactoryModel.ssdl|res://*/FactoryModel.msl;provider=System.Data.SqlClient;provider connection string=&quot;  
              data source=VNWKTTV093\SQLEXPRESS;initial catalog=FactoryPattern;persist security info=True;user id=admin;password=admin;MultipleActiveResultSets=True;App=EntityFramework&quot;"   
      providerName="System.Data.EntityClient" />  
  </connectionStrings>  
  <entityFramework>  
   <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" />  
   <providers>  
    <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />  
   </providers>  
  </entityFramework>  
 </configuration>  


- Trên Form1.cs, chúng ta thiết kế một giao diện đơn giản để tìm kiếm employee như hình 11 bao gồm 1 textbox (txtName) làm điều kiện tìm kiếm, 1 button (btnSearch) để xử lí yêu cầu và 1 DataGridView (dgvEmployee) để hiển thị dữ liệu.
(hình 11)

- Trong Code-behind của Form1.cs, ta tạo sự kiện click của button Search. Bên trong sự kiện btnSearch_Click, đơn giản là ta sử dụng DbContext FactoryPatternEntities mà ta đã tạo ra thông qua Entity Framework để thực hiện một truy vấn tìm kiếm dựa theo Name. Sau đó ta gán dữ liệu tìm thấy vào lưới mà ta đã design ở hình 11.

Kiên đoán là bước này khá dễ dàng với các bạn. Hãy tham khảo đoạn code trong hình 12.
(hình 12)

- Chúng ta vào database FactoryPattern, ta tạo vài dòng dữ liệu trong table employee như hình 13.
(hình 13)

- Vào lại source code trong Visual Studio, Start Debugging (F5) để chạy chương trình. Sau đó nhấn Search để kiểm tra kết quả trả về như hình 14. Hãy chắc là DataFieldName của các column trong DataGridView tương thích với dữ liệu tìm được.
(hình 14)

- Như các bạn thấy, rất dễ dàng để chúng ta tạo một kết nối đến MSSQL và xử lí truy vấn dữ liệu thông qua cơ chế của Entity Framework.

- Hãy nhìn lại cách thức mà DbContext FactoryPatternEntities tạo ra kết nối đến database như hình 15. Khi DbContext này được tạo ra (hàm khởi tạo FactoryPatternEntities không tham số), nó sẽ đọc thông tin từ file App.config và tìm đến key có name là FactoryPatternEntities như Kiên đã nói đến trong hình 10, lúc này nó sẽ đọc thông tin từ connectionString và khởi tạo kết nối.
(hình 15)

- Chúng ta mở file App.config và chú ý đến key FactoryPatternEntities connectionString. Thông tin trong connectionString bao gồm Metadata, Provider, Data source, Initial catalog, Persist security info, User id, Password, MultipleActiveResultSets và App. được ngăn cách nhau bởi dấu ";"
  <connectionStrings>  
   <add name="FactoryPatternEntities"   
      connectionString="metadata=res://*/FactoryModel.csdl|res://*/FactoryModel.ssdl|res://*/FactoryModel.msl;provider=System.Data.SqlClient;provider connection string=&quot;  
              data source=VNWKTTV093\SQLEXPRESS;initial catalog=FactoryPattern;persist security info=True;user id=admin;password=admin;MultipleActiveResultSets=True;App=EntityFramework&quot;"   
      providerName="System.Data.EntityClient" />  
  </connectionStrings>  


BƯỚC TIẾP THEO: Tạo ConnectionString.

- Đôi khi chúng ta sẽ không muốn để tất cả những thông tin kết nối đến database như tên database, user name, password... trong file App.config. Thay vào đó chúng ta sẽ tạo ra một ConnectionString thay thế cho việc lấy thông tin kết nối trực tiếp từ file App.config.

- Để tạo được connection string, đơn giản là ta tạo một class mới, đặt tên là Connection.cs, bên trong ta viết một method có tên GetConnectionString như hình 16 và đoạn Code bên dưới. Các giá trị bên trong method này được lấy từ file App.config.
(hình 16)
Code:
 public override string GetConnectionString()  
     {  
       SqlConnectionStringBuilder sqlBuilder = new SqlConnectionStringBuilder();  
       sqlBuilder.DataSource = @"VNWKTTV093\SQLEXPRESS";  
       sqlBuilder.InitialCatalog = "FactoryPattern";  
       sqlBuilder.MultipleActiveResultSets = true;  
       sqlBuilder.IntegratedSecurity = true;  
       sqlBuilder.ApplicationName = "EntityFramework";  
       EntityConnectionStringBuilder efBuilder = new EntityConnectionStringBuilder();  
       efBuilder.Metadata = "res://*/FactoryModel.csdl|res://*/FactoryModel.ssdl|res://*/FactoryModel.msl";  
       efBuilder.Provider = "System.Data.SqlClient";  
       efBuilder.ProviderConnectionString = sqlBuilder.ConnectionString;  
       return efBuilder.ConnectionString;  
     }  


- Vì DbContext FactoryPatternEntities được tạo ra không có hàm khởi tạo có tham số là một ConnectionString nên chúng ta sẽ sử dụng tính năng Partial Class của .NET để bổ sung hàm khởi tạo có tham số vào DbContext FactoryPatternEntities của chúng ta.
Bạn có thể tham khảo Partial Class ở đây: Partial Class trong C#

- Chúng ta thêm mới một class và đặt trùng tên với DbContext FactoryPatternEntities, bao gồm cả từ khóa partial. Bây giờ chúng ta có thể bổ sung hàm khởi tạo có tham số đầu vào là một ConnectionString cho FactoryPatternEntities như hình 16.
(hình 16)

- Chúng ta cũng cập nhật lại sự kiện btnSearch_Click trong form Form1.cs. Ở đây ta khởi tạo class Connection, sau đó gọi method GetConnectionString được viết ở trên để lấy được ConnectionString, sau đó khởi tạo DbContext FactoryPatternEntities thông qua ConnectionString này. Hãy xem lại đoạn code được cập nhật trong hình 17.
(hình 17)

- Start Debugging (F5) và kiểm tra kết quả để đảm bảo chúng ta vẫn tạo được kết nối đến database.  như hình 18.
(hình 18)
Trên đây là ví dụ khá đơn giản để chúng ta làm quen với Entity Framework - Database First. Trong các bài tiếp theo Kiên sẽ giới thiệu đến các bạn chi tiết hơn cũng như là hai mô hình còn lại.

Nếu có thắc mắc hay trao đổi gì, các bạn có thể để lại comment bên dưới bài viết này.

Share to be shared!


No comments:

Post a Comment