Tìm hiểu entity framework
Trang 1TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN
KHOA CÔNG NGHỆ PHẦN MỀM
-❧❧❧❧ -CÔNG NGHỆ NET
ĐỀ TÀI: TÌM HIỂU ENTITY FRAMEWORK
Giảng viên hướng dẫn: ThS Phạm Thi Vương Sinh viên thực hiện:
HỒ CHÍ MINH – 01/2018
Trang 2Nhận Xét Của Giảng Viên
………
……….
………
……….
………
……….
………
……….
………
……….
………
……….
………
……….
………
……….
………
……….
………
……….
………
……….
………
……….
………
……….
………
……….
………
……….
………
……….
………
……….
………
……….
………
……….
………
……….
………
……….
………
……….
………
Trang 3………
……….
………
……….
………
……….
………
……….
………
……….
………
……….
………
……….
………
……….
………
……….
………
……….
………
……….
………
……….
………
Trang 4I Giới thiệu về Entity Framework:
‘’Entity Framework is Microsoft’s recommended data access technology for new applications
EF là công nghệ truy vấn dữ liệu cho các ứng dụng mới được đề nghị sử dụng bởi Microsoft.’’
Entity Framework là các công nghệ hỗ trợ cho việc phát triển các phầnmềm hướng đối tượng Entity Framework cho phép nhà pháp triển làm việc với
dữ liệu dưới dạng đối tượng cụ thể và các thuộc tình, giống như khách hàng vàđịa chỉ khách hàng, mà không cần quan tâm đến các bảng và cột bên dưới kholưu trữ dữ liệu Với Entity Framework nhà phát triển có thể làm việc ở cấp trừutượng cao hơn khi xử lý dữ liệu, và có thể tạo và duy trì phần mềm hướng đốitượng ít mã hơn so với phần mềm truyền thống
A Tổng quan
Microsoft ADO.NET Entity Framework là một Object / Relational Mapping (ORM) làm giảm đi sự không tương hỗ giữa phương pháp phát triển hướng đối tượng của nhà phát triển NET và thế giới của cơ sở dữ liệu quan hệ Cho phép nhà phát triển chủ yếu tương tác với mô hình khái niệm của ứng dụng, sử dụng các kỹ thuật hướng đối tượng quen thuộc.Cho phép các nhà phát triển dể dàng làm việc với dữ liệu quan hệ như là các đối tượng domain-specific, loại bỏ đi sự khó khăn trong việc truy cập dữ liệu trước đây Bằng cách sử dụng Entity
Framework, truy vấn LINQ, thì việc lấy và thao tác dữ liệu như các đối tượng trở nên mạnh mẽ hơn Entity Framework ORM cung cấp các dịch vụ như change tracking, idenity resolution, lazay loading, và truy vấn dữ liệu tập trung vào
business logic của ứng dụng
O/RM
Trang 5ORM là kỹ thuật chuyển đổi dữ liệu
giữa các hệ thống khác (không phải
là mô hình hướng đối tượng) sang
các đối tượng trong ngôn ngữ lập
trình hướng đối tượng Trong
trường hợp này chúng ta chuyển dữ
liệu từ các dòng dữ liệu trong CSDL
quan hệ sang đối tượng Tìm hiểu
thêm về O/RM tại đây
O/RM giúp tách riêng database và domain class để dễ phát triển và maintainHiểu đơn giản hơn, ORM là cộng cụ để generate class từ database:
Có nhiều ORM frameworks dành cho net trên thị trường như là: DataObjects.Net, NHibernate, OpenAccess, SubSonic
Lưu ý: Entity Framework là mã nguồn mở ORM framework của Microsoft
C Tại sao nên sử dụng LinQ hay Entity Framework
Với SQLExpress để truy vấn dữ liệu ta phải dùng đến các câu lệnh Query khá phức tạp Hơn nữa để sử dụng trong ứng dụng C# lại thêm 1 tầngphức tạp nữa với các câu lệnh: dùng ConnectionString khởi tạo kết nối tớiDataBase, tự khai báo các biến để chạy 1 lệnh - command, rồi còn phải tính toán
Trang 6-đầu ra của câu lệnh Thật là quá phức tạp nếu như ta có 1 chương trình
"khủng"
Vậy làm sao để giải quyết vấn đề này?
Lợi ích lớn nhất của EF là giúp lập trình viên giảm thiểu việc lập trình mãnguồn cần thiết để truy cập và tương tác với cơ sở dữ liệu
EF được Microsoft hỗ trợ phát triển lâu dài và bền vững, vì vậy EF là 1framework mạnh nhất hiện nay để phát triển ứng dụng Web với sự hỗ trợ đôngđảo của các nhà phát triển Web
II Hướng dẫn cài đặt Entity Framework
EF bao gồm EF Tools cho Visual Studio và EF Runtime
A EF Tools dành cho Visual Studio
EF6 Tools đã được thêm vào từ phiên bản VS 2013 Nếu bạn đang sử dụngphiên bản VS 2012 thì có thể cài đặt tại đây (Bạn phải đảm bảo Microsoft WebDeveloper Tools hoặc Microsoft SQL Server Data Tools đã được cài đặt trước khicài đặt EF Tools)
B EF Runtime
Phiên bản mới nhất của Entity Framework đã có trên NuGet
Cài đặt EF Nuget Package
Bạn có thể cài EF package bằng cách click phải vào folder References vàchọn Manage NuGet Packages …
Trang 7 Để cài Entity Framework, bạn nhấn chuột phải vào thư mục References(hoặc bin) trong dự án Web và chọn Manage NuGet Packages.
Sau đó bạn tìm và cài đặt gói Entity Framework vào dự án Web
Cài đặt gói EF bằng dòng lệnh (Package Manger Console)
Bạn chọn thư mục cần cài đặt EF (bin hoặc References), sau đó chọn menuTools -> Library Package Manager -> Package Manager Console như tronghình
Trang 8Ở phần dòng lệnh dưới đáy bộ công cụ, bạn gõ: Install-PackageEntityFramework
Cài đặt bản EF mới nhất
Để cài đặt phiên bản EF mới nhất, bạn có thể chọn Include Prerelease trongcửa sổ Manage NuGet Package
Trang 9III Kiến trúc của Entity Framework
Có 2 tầng chính trong ứng dụng Entity Framework:
để độc lập với mô hình quan hệ các bảng trong database
- Mô hình ánh xạ Mapping – Mapping specification language (MSL): định nghĩacác ánh xạ giữa lớp conceptual và logical, nội dung này được lưu trong tậptin msl Mô hình ánh xạ gồm thông tin về cách mô hình khái niệm được ánh
Trang 10A Application
Application (ứng dụng) là tầng chứa giao diện trang Web (HTML, CSS,
Javascript, hình ảnh, …) và các đoạn mã nguồn (C#, VB) để tương tác dữ liệu với các tầng khác trong mô hình thông qua Object Services
B Object Services
Object Services (tạm dịch là các dịch vụ đối tượng) là tầng chứa quá
trình tương tác giữa ứng dụng và database, hay nói cách khác nó là nơi chủ yếu
để truy cập dữ liệu từ database và trả ngược kết quả về giao diện ObjectServices cung cấp các tiện ích để truy vết các thay đổi và quản lý nhận dạng,đồng thời là các quan hệ và thay đổi ở database
Đây là các class tự động sinh ra tương ứng với mô hình dữ liệu Cácclass này bao gồm:
năng quản lý các kết nối, định nghĩa mô hình dữ liệu với metadata và thaotác với database Lớp này cũng có thể thêm vào các phương thức đạidiệ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ượngnày tương ứng với một table Có thể lấy được các đối tượng này thôngqua 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 đốitượng thể hiện mối quan hệ (relationship) giữa hai entity class Mỗi đốitượ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:
Trang 11sau đó sử dụng LINQ to Entities để lấy ra tất cả các sản phẩm (trong bảngProductvà in ra màn:
ObjectContext context = new ObjectContext ("name=ProductDBEntities");
ObjectSet<Product> products = context.CreateObjectSet<Product>();
var query = from p in products
C 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ớpnày được định nghĩa bởi ngôn ngữ riêng theo định dạng XML.( EDM khác với
EntityClient Data Provider ở chỗ EDM sử dụng LINQ là ngôn ngữ truy vấn tương tác với database.)
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
❖ Database First:
Trang 12Đây là cách thông thường và được hỗ trợ từ phiên bản EF 1 trong Visual Studio2008.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
L2E (LINQ to Entities): là 1 ngôn ngữ truy vấn được dùng để viết các truy vấn
trái với mô hình đối tượng L2E trả về các thực thể, được định nghĩa bởi mô hình kháiniệm Chúng ta có thể dùng LINQ trong ngôn ngữ này
Trang 13Tham 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 Trongquá 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ậptin 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ì
D EntityClient Data Provider
Đây là tầng cung cấp các kết nối, diễn dịch các truy vấn thực thể thành truy vấn nguồn dữ liệu (chuyển L2E – LINQ to Entity hay các truy vấn thực thể SQL thành truy vấn SQL), trả về data reader để EF dùng chuyển dữ liệu thực thểthành các đối tượng Phần này kết nối ADO.NET Data Providers để gửi hoặc lấy
dữ liệu từ database Tầng này hoàn toàn khác với EDM (Entity Data Model) khi thực thi các truy vấn tương tự như cách thực hiện ở ADO.NET Provider
EntityClient Data Provider sử dụng ESQL (Entity SQL), một ngôn ngữ truy vấn độc lập dạng văn bản, tương tự như SQL
EntityClient là một data provider mới của ADO.NET dùng để truy xuất đếndatabase Đượ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 providerkhá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 providerkhá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ốibằng EntityConnection, tạo các câu truy vấn bằng EntityCommand và đọc kếtquả bằng EntityDataReader
Trang 14Mộ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úclệ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ượngEntityCommand và sử dụng tham số để lấy các sản phẩm có ID là 1:
cmd.Parameters.AddWithValue("catId", id);
EntityDataReader reader = cmd.ExecuteReader(CommandBehavior.SequentialAccess); while (reader.Read())
{
var catId = reader["id"];
var name = reader["ProductName"];
Console.WriteLine("{0,-3}{1}", catId, name);
}
reader.Close();
}
E ADO.NET Data Providers
Đây là tầng thấp nhấp để dịch các truy vấn L2E (LINQ to Entity) thông quacây lệnh thành các câu lệnh SQL và thực thi các câu lệnh trong hệ thống DBMS (database management system – hệ quản lý dữ liệu) nào đó Tầng này kết với database sử dụng ADO.NET
IV Vị trí của Entity Framework trong mô hình lập trình và phát
triển Web
Chắc hẳn, bạn đã biết về mô hình Web 3 tầng (n tầng) khi đọcsách, giáo trình, bài giảng về nội dung lập trình Web Tuy nhiên, vấn đềbạn cần phải hiểu rõ là: việc định rõ số lượng các tầng và các mối liên hệgiữa các tầng trong mô hình phát triển Web cũng rất đa dạng, tùy theocách hiểu các lập trình viên và dự án Web Do đó, việc hiểu EntityFramework nằm ở đâu trong mô hình Web 3 tầng cũng không hoàn toàn
Trang 15dễ dàng Trong phần này, tôi có tham khảo từ Stephen M Redd nhằm giúpcác bạn hiểu rõ bản chất vấn đề hơn.
Đầu tiên, chúng ta có vị trí của EF trong mô hình dự án Web ASP.NETMVC
Trong mô hình trên, chúng ta thấy vị trí của EF nằm trọn trong tầngData Access Layer, tức là EF đóng vai trò là nơi trung gian để tương tác
dữ liệu từ database với các tầng cao hơn, chẳng hạn như Business Layer.Hay nói cách khác, EF đóng vai trò như là phiên bản mới của ADO.NET.Tuy nhiên vị trí của EF trong mô hình này chỉ có trên lý thuyết
Trang 16Thật sự, khi bắt tay xây dựng nhiều dự án Web, vị trí thường thấy
EF ở các dự án website trên thực tế như mô hình sau
Trong hình trên, EF dường như có vị trí rất tự do, xuất hiện ở cả 3tầng Data Access Layer, Business Layer, và cả Presentation Layer Cácbạn có thể hình dung EF như là 1 thư viện, hễ tầng nào cần thì chỉ cần gọiđến Mô hình này xuất phát có thể là sự cẩu thả của lập trình viên khikhông thích tuân theo tiêu chuẩn quan hệ giữa các tầng hoặc cách giảithích khác là sự lỏng lẻo giúp cho việc lập trình thuận tiện hơn Trong vài
mô hình người ta gom tầng Data Access Layer và Business Layer chỉ làmtầng Data Model, và vị trí EF cũng bao hàm tầng Data Model và
Trang 17Presentation Layer như hình.
Đến đây, bạn có thể hiểu 1 cách chung nhất EF có vị trí trung gian,đóng vai trò kết nối giữa cơ sở dữ liệu và các thành phần khác của 1 dự
án Web khi cần đến Ngoài ra, có nhiều cách hiểu về vị trí của EF ở đâutrong mô hình Web, bạn sẽ dần khám phá để đưa ra cách hiểu và địnhnghĩa riêng trong quá trình thiết kế và xây dựng dự án Web ASP.NET
V Các phiên bản của Entity framework
2 phiên bản đầu tiên của EF đi kèm với NET framework và được đặt tên phiên bản cùng với tên phiên bản NET tương ứng là 3.5 và 4 Sau 2 phiên
bản này EF đã cho ra các phiên bản độc lập
Các phiên bản của EF và tính năng của chúng
Trang 18EF
4.0
Bản này đi kèm với NET Framework 4 và Visual Studio 2010 Các tính năng mới trong bảng này gồm: hỗ trợ POCO, lazy loading, testability improvements, customizable code generation và quy trìnhModel First Mặc dù là phiên bản thứ 2 nhưng lại được đặt là EF 4
để phù hợp với phiên bản NET đi chung Sau bản này thì Microsoft
đã bắt đầu cung cấp EF sẵn có trên NuGet và không còn gắn liền
với phiên bản NET Framework
Sửa bug phiên bản trước và giới thiệu các component để giúp cho
thời gian thiết kế để làm việc với Code Frist model dễ dàng hơn.Các component này được sử dụng bởi Code First Migrations ( trong
EF 5
Bản release này được sử dụng trong VS2010 và VS 2012 để viết ứng dụng có sử dụng NET 4.0 và NET 4.5 Khi hướng đến NET 4.5 bản release có giới thiệu thêm một vài tính năng mới như hỗ trợ
Trang 19enum, table-valued functions, spatial data types và cải thiệu nhiều
về performance
Nếu bạn cài đặt một model mới sử dụng EF Designer trong VS
2012, the EF5 NuGet package sẽ được cài vào project và tự động sinh code để sử dụng EF5 Khi tạo projects mới về ASP.NET trong
VS 2012 ( bao gồm cả project về MVC) cũng sẽ được cài đặt EF5 NuGet đi kèm mặt định
EF Designer trong VS2012 cũng hỗ trợ multiple-diagrams cho một model, thay đổi màu cho các khối trong bản thiết kế và import STD
EF 6
Bản release này được sử dụng trong VS 2013, VS 2012 và VS 2010( chỉ EF Runtime) để viết ứng đụng hướng đến NET 4.0 và NET 4.5
Tooling
The EF6 Tooling is included in Visual Studio 2013 and available for download for Visual Studio 2012 See the Get Entity
Frameworkpage for more information
The focus for the tooling in EF6 was to add support for the EF6 runtime and to enable shipping out-of-band between releases of Visual Studio
The tooling itself does not include any new features, but most of the new runtime features can be used with models created in the EF Designer
- Async Query and Save adds support for the task-based
asynchronous patterns that were introduced in NET 4.5
- Connection Resiliency enables automatic recovery from
transient connection failures
Trang 20- Code-Based Configuration gives you the option of performing configuration – that was traditionally performed in a config file – in code
- Dependency Resolution introduces support for the Service Locator pattern and we've factored out some pieces of functionality that can be replaced with custom implementations
- Interception/SQL logging provides low-level building blocks for interception of EF operations with simple SQL logging built on top
- Testability improvements make it easier to create test doubles
for DbContext and DbSet when using a mocking
framework or writing your own test doubles
- DbContext can now be created with a DbConnection that is already opened which enables scenarios where it would be helpful
if the connection could be open when creating the context (such as sharing a connection between components where you can not guarantee the state of the connection)
- Improved Transaction Support provides support for a
transaction external to the framework as well as improved ways of creating a transaction within the Framework
- Enums, Spatial and Better Performance on NET 4.0 - By
moving the core components that used to be in the NET
Framework into the EF NuGet package we are now able to offer enum support, spatial data types and the performance
improvements from EF5 on NET 4.0
- Improved performance of Enumerable.Contains in LINQ
queries
- Improved warm up time (view generation), especially for large
models
- Pluggable Pluralization & Singularization Service
- Custom implementations of Equals or GetHashCode on entity
classes are now supported
- DbSet.AddRange/RemoveRange provides an optimized way to
add or remove multiple entities from a set
- DbChangeTracker.HasChanges provides an easy and efficient
way to see if there are any pending changes to be saved to the database
- SqlCeFunctions provides a SQL Compact equivalent to
the SqlFunctions
The following features apply to Code First only:
- Custom Code First Conventions allow write your own
Trang 21conventions to help avoid repetitive configuration We provide a simple API for lightweight conventions as well as some more
complex building blocks to allow you to author more complicated conventions
- Code First Mapping to Insert/Update/Delete Stored
Procedures is now supported
- Idempotent migrations scripts allow you to generate a SQL script that can upgrade a database at any version up to the latest version
- Configurable Migrations History Table allows you to customize the definition of the migrations history table This is particularly useful for database providers that require the appropriate data typesetc to be specified for the Migrations History table to work
correctly
- Multiple Contexts per Database removes the previous limitation
of one Code First model per database when using Migrations or when Code First automatically created the database for you
- DbModelBuilder.HasDefaultSchema is a new Code First API thatallows the default database schema for a Code First model to be configured in one place Previously the Code First default schema was hard-coded to "dbo" and the only way to configure the schema
to which a table belonged was via the ToTable API
- DbModelBuilder.Configurations.AddFromAssembly
method allows you to easily add all configuration classes defined in
an assembly when you are using configuration classes with the Code First Fluent API
- Custom Migrations Operations enabled you to add additional operations to be used in your code-based migrations
- Default transaction isolation level is changed to
READ_COMMITTED_SNAPSHOT for databases created using
Code First, allowing for more scalability and fewer deadlocks
- Entity and complex types can now be nestedinside classes.
Trang 22- Tooling consolidation provides a consistent way to create a new
EF model This feature extends the ADO.NET Entity Data Model wizard to support creating Code First models, including reverse engineering from an existing database These features were
previously available in Beta quality in the EF Power Tools
- Handling of transaction commit failures provides
the CommitFailureHandler which makes use of the newly introducedability to intercept transaction operations The
CommitFailureHandler allows automatic recovery from connection failures whilst committing a transaction
- IndexAttribute allows indexes to be specified by placing an
[Index] attribute on a property (or properties) in your Code First model Code First will then create a corresponding index in the database
- The public mapping API provides access to the information EF has on how properties and types are mapped to columns and tables
in the database In past releases this API was internal
- Ability to configure interceptors via the App/Web.config
file allows interceptors to be added without recompiling the
application
- System.Data.Entity.Infrastructure.Interception.DatabaseLogge
ris a new interceptor that makes it easy to log all database
operations to a file In combination with the previous feature, this allows you to easily switch on logging of database operations for a deployed application, without the need to recompile
- Migrations model change detection has been improved so that
scaffolded migrations are more accurate; performance of the
change detection process has also been enhanced
- Performance improvements including reduced database
operations during initialization, optimizations for null equality
comparison in LINQ queries, faster view generation (model
creation) in more scenarios, and more efficient materialization of tracked entities with multiple associations
The runtime is available on NuGet If you are using Code First then there is no need to install the tooling Follow the instructions onour Get It page for installing the latest version of Entity Framework runtime
The tooling for Visual Studio 2012 and Visual Studio 2013
is available on the Microsoft Download Center You only need to
Trang 23install the tooling if you want to use Model First or Database First.
EF runtime đã có sẵn trên NUGET Làm theo hướng dẫn trên page
để cài đặt phiên bản mới nhất
EF Tooling VS2012 và VS2015 đã có sẵn trên Microsoft
Download Center Bạn chỉ cần cài đặt EF tooling nếu bạn muốn
tạo model sử dụng EF Designer hoặc sinh Code First model từ database đã tồn tại
- Các medthod của SqlFile và SqlResource về DbMigration cho
phép bạn chạy một SQL script được lưu trữ như là một tập tin hoặc nguồn nhúng
EF runtime đã có sẵn trên NUGET Làm theo hướng dẫn trên
page để cài đặt phiên bản mới nhất
EF Tooling VS2012 và VS2015 đã có sẵn trên Microsoft
Download Center Bạn chỉ cần cài đặt EF tooling nếu bạn muốn
tạo model sử dụng EF Designer hoặc sinh Code First model từ database đã tồn tại
Tìm hiểu các phiên bản trước Past Versions
VI Thiết kế Entity Data Model
Là thành phần trung gian giữa ứng dụng và database, Entity DataModel (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
Trang 24đối tượng bussiness (hay object layer) trong ứng dụng Dựa vào sự lựachọn thành phần nào sẽ được tạo ra trước, một ứng dụng EntityFramework (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ữacác thành phần dữ liệu trong ứng dụng của Entity Framework Phần Modeltương ứng với tập tin edmx, Code tương ứng với tập tin cs (hoặc vb nếubạn dùng VB.NET)
Trang 25Note: 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
- Code là mã lệnh tạo thành các lớp đối tượng dữ liệu chophép thao tác với dữ liệu
- Model là sơ đồ gồm các hộp mô tả các thực thể và các
đường nối kết mô tả các quan hệ
- Database là cơ sở dữ liệu (có thể là SQL Server, Compact
SQL Server, Local database, MySQL, Oracle,…)
- Database first:
Đây là cách thông thường và được hỗ trợ từ phiên bản EF 1 trongVisual Studio 2008.EF sẽ tự động tạo ra data model và các class (objectlayer) cho bạn từ database có sẵn thông qua công cụ Entity Data ModelWizard 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
Trang 26Phương pháp chỉ nên dùng khi ta đã có sẵn CSDL (không phải tạo.
Nên dùng khi ta bắt đầu thiết kế CSDL từ đầu (từ chưa có gì)
- 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ệntạ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ệchoặc muốn tạo ra Với hướng tiếp cận này, bạn sẽ sử dụng classDbContext thay vì ObjectContext để thao tác với database Việc sử dụngCode First đòi hỏi bạn phải thực hiện các công việc một cách thủ côngnhưng bù lại nó linh hoạt và được sử dụng rất phổ biến
Nên dùng khi đã có mô hình CSDL, ta sẽ chỉ viết code từ đó tạo Database.
Dù cách nào thì cuối cùng cũng phải có Code để thao tác trong mãlệnh và Database để lưu trữ dữ liệu Model chỉ là một thành phần trunggian
Theo kinh nghiệm của nhiều lập trình viên đi trước, Code First làphương án mềm dẻo nhất (hơi mất công ngồi gõ code, tuy nhiên nếu dùngtốt code snippets thì đỡ nhiều)
Trước đây khi lập trình CSDL trong VB, VC,… ta luôn tạo CSDL liệutrước, sau đó mới xây dựng mã lệnh truy cập dữ liệu
Trong bài này tôi sẽ hướng dẫn tạo 1 project Code First với cơ sở
dữ liệu có sẵn
Trang 27A 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ừngbước dựa vào công cụ Entity Data Model Designer
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à MusicModel phần mở rộng mặc định là edmx Nhấn Add.
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ọnmặc định là Generate from database và nhấn Next
Trang 28Bướ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 Saveentity connection settings in App.Config, chuỗi kết nối này sẽ tự động được thêmvà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à MusicStoreEntities
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 NewConnection… Các kết nối mà bạn đã tạo sẽ hiện ra trong cửa sổ ServerExplorer Nhấn Next
Trang 29Bướ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,sử dụng tất cả table là
Sau khi nhấn Finish, tập tin MusicModel.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.NETEntity Data Model Designer với giao diện trực quan như hình dưới Nếu muốncoi 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à MappingDetails
Trang 30Ngoài tập tin .edmx trên, một tập tin khác cũng được tự động tạo ra
là MusicStoreModel.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à: MusicStoreEntities,Artist, và Song Trong đó, class MusicStoreEntities 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
1 Kiểm tra kết quả với LINQ to EntitiesViệ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:
MusicStoreEntities db = new MusicStoreEntities ();
var query = from song in db.Songs
Trang 3112 //
Output:
Hello
Some One Like You
//Thay đổi cấu trúc database
Bạn có thể thoải mái thay đổi cấu trúc các bảng, thuộc tính và dữ liệu trong database Mỗi lần thay đổi thay vì gieo lại mô hình bạn có thể dùng chức năng cập nhật mô hình trong dự án Chọn tập tin Models/Model.edmx, sau đó
mở tập tin này ra bạn thấy sơ đồ cấu trúc các bảng như sau
Chọn chuột lên vùng trống ở giao diện mô hình khi mở tập tin Model.edmx,
chọn chuột phải, chọn Update model from Database…
Trang 32Sau đó, bạn chọn chế độ Refresh dành cho các bảng đã thêm vào mô hình hoặc Add dành cho các bảng mới Sau khi thao tác xong thì chọn Finish.
Trang 33Vậy là xong về cách cập nhật mô hình Trong trường hợp có lỗi phát sinh mà bạn không thể sửa được, cách tốt nhất là xóa toàn bộ nội dung trong thư mụcModels và gieo lại mô hình.
Kết luận: Như vậy, bạn đã xong gieo xong mô hình (Model), để áp dụng mô
hình này vào Controller và hiển thị dữ liệu ra View mời bạn xem bài tiếp theo
B Tạo EDM theo hướng Model First (Step by Step)
Một cách tiếp cận khác khi phát triển ứng dụng phần mềm là xây dựng
mô hình trước, tạo database và gieo mã nguồn sau Phương pháp này giúp
cho chúng ta nắm và hình dung được mô hình phần mềm ở mức độ tổng quan,
từ đó mới phân chia phần mềm thành các phần con và triển khai xây dựng ứng
dụng Thông thường, các ứng dụng có quy mô lớn đến rất lớn sẽ ưu tiên sử
dụng phương pháp này Lý do là ở những ứng dụng này, cái người ta cần là có
sự quy hoạch chuẩn xác trên giấy (mô hình) vì quy mô quá lớn thay vì chỉ có tầmnhìn hạn hẹp làm tới đâu biết đến đó với những cách tiếp cận xây dựng phầnmềm khác Đôi khi có những module trùng lặp hoặc có sự kết nối/kế thừa giữacác module trong ứng dụng lớn, mô hình giúp chúng ta hình dung và giải quyếtđược các vấn đề đó
Ví dụ xây dựng 1 hệ thống thông tin quản lý điện tử của 1 trường đại họcbao gồm các chức năng như tin tức/thông báo, quản lý học phần/điểm, quản lýsinh viên, quản lý cán bộ, quản lý tiền lương cán bộ, quản lý thời khóa biểu,quản lý trung tâm thư viện, quản lý ký túc xá, quản lý nghiên cứu khoa học, quản
lý đối tác/cộng tác, quản lý tuyển sinh, … Ở hệ thống này, vì có quá nhiềumodule cho nên chúng ta không thể xây dựng theo kiểu Code First hay
Trang 34Database First do không thể nắm và tối ưu hết được các công đoạn cần làm.
Chẳng hạn, chúng ta xây dựng bảng SinhVien dùng để lưu trữ sinh viên, nếu để
ý có thể thấy bảng SinhVien có thể dùng cho các module như: quản lý họcphần/điểm, quản lý sinh viên, quản lý thời khóa biểu, quản lý thư viện (mượn trảsách), … Nếu xây dựng phần mềm theo các phương pháp khác, đôi khi chúng takhó nhìn tổng quan vì vậy có thể tạo bảng SinhVien lặp lại ở nhiều module con
Model First cho phép bạn tạo 1 mô hình dùng Entity Framework Designer và sau đó gieo lược đồ cơ sở dữ liệu từ mô hình Mô hình được lưu trữ ở tập tin EDMX (.edmx) và có thể xem, chỉnh sửa ở Entity Framework
Designer Các lớp tương tác với ứng dụng được tự động gieo từ tập tin EDMX
Tương tự như Database First hay Code First, bạn cần có Visual Studio 2013 để
thực hiện ứng dụng Nếu bạn xài VS 2010 hay VS 2012 bạn cần cài đặt thêm
gói NuGet.
1 Tạo ứng dụng
Để các bạn dễ nắm bắt, chúng ta sẽ tạo 1 ứng dụng Console dùng Model First
để thực thi truy cập dữ liệu
Trang 35Mở Visual Studio, chọn File -> New -> Project…, chọn Visual C# và Console
Application, đặt tên ứng dụng là DammioModelFirst, sau đó nhấn OK.
2 Tạo mô hình
Để tạo mô hình cho ứng dụng, chúng ta chọn Project, chuột phải -> Add -> Add
Trang 36New Item…
Tiếp đến bạn chọn mục Data dưới mục Visual C# Items bên menu trái và
chọn ADO.NET Entity Data Model, đặc tên mô hình là DammioModel, chọn
Empty EF Designer Model (hoặc Empty model) và nhấn Finish để hoàn thành
Trang 38Tiếp theo, tập tin DammioModel.edmx được mở ra với 1 mô hình trống Bây giờ
chúng ta sẽ tiếp hành xây dựng mô hình bằng cách thêm mới các thực thể
(entity), thuộc tính và các mối quan hệ giữa các thực hiện trong mô hình
Rê chuột vào vùng trống, chuột phải chọn Properties Trong cửa sổ Properties, chúng ta có thể thay đổi tên thuộc tính “Entity Container Name” với giá trị
là DammioModelContainer thành BloggingContext hay bất cứ tên nào bạn
muốn
Đây là tên context kế thừa từ lớp DbContext sẽ được tự động gieo mã nguồn, context thể hiện 1 phiên làm việc với database, cho phép chúng ta truy vấn và lưu trữ dữ liệu
Tiếp đến, chúng ta tạo 1 thực thể bằng cách chuột phải lên vùng trống,
chọn Add New -> Entity… Đặt tên thực thể là Blog và BlogId là khóa chính,
sau đó nhấn OK