Tìm hiểu entity framework
TRƯỜ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 Nhận Xét Của Giảng Viên ……………………………………………………………………………………………………………… ………………………………………………………………………… ……………………………………………………………………………………………………………… ……………………………………………… ……………………………………………………………………………………………………………… ……………………………………………… ……………………………………………………………………………………………………………… ……………………………………………… ……………………………………………………………………………………………………………… ……………………………………………… ……………………………………………………………………………………………………………… ……………………………………………… ……………………………………………………………………………………………………………… ……………………………………………… ……………………………………………………………………………………………………………… ……………………………………………… ……………………………………………………………………………………………………………… ……………………………………………… ……………………………………………………………………………………………………………… ……………………………………………… ……………………………………………………………………………………………………………… ……………………………………………… ……………………………………………………………………………………………………………… ……………………………………………… ……………………………………………………………………………………………………………… ……………………………………………… ……………………………………………………………………………………………………………… ……………………………………………… ……………………………………………………………………………………………………………… ……………………………………………… ……………………………………………………………………………………………………………… ……………………………………………… ……………………………………………………………………………………………………………… ……………………………………………… ……………………………………………………………………………………………………………… ……………………………………………… ……………………………………………………………………………………………………………… ……………………………………………… ……………………………………………………………………………………………………………… ……………………………………………… ……………………………………………………………………………………………………………… …………………………………………………………………………………………………… ……………………………………………………………………………………………………………… ……………………………………………… ……………………………………………………………………………………………………………… ……………………………………………… ……………………………………………………………………………………………………………… ……………………………………………… ……………………………………………………………………………………………………………… ……………………………………………… ……………………………………………………………………………………………………………… ……………………………………………… ……………………………………………………………………………………………………………… ……………………………………………… ……………………………………………………………………………………………………………… ……………………………………………… ……………………………………………………………………………………………………………… ……………………………………………… ……………………………………………………………………………………………………………… ……………………………………………… ……………………………………………………………………………………………………………… ……………………………………………… ……………………………………………………………………………………………………………… ……………………………………………… ……………………………………………………………………………………………………………… ……………………………………………… ……………………………………………………………………………………………………………… ……………………………………………… ……………………………………………………………………………………………………………… ……………………………………………… ………………………………………………………………………………………… I Giới thiệu Entity Framework: ‘’Entity Framework is Microsoft’s recommended data access technology for new applications EF công nghệ truy vấn liệu cho ứng dụng đề nghị sử dụng Microsoft.’’ Entity Framework công nghệ hỗ trợ cho việc phát triển phần mềm hướng đối tượng Entity Framework cho phép nhà pháp triển làm việc với liệu dạng đối tượng cụ thể thuộc tình, giống khách hàng địa khách hàng, mà không cần quan tâm đến bảng cột bên kho lưu trữ liệu Với Entity Framework nhà phát triển làm việc cấp trừu tượng cao xử lý liệu, tạo trì phần mềm hướng đối tượng mã so với phần mềm truyền thống A Tổng quan Microsoft ADO.NET Entity Framework Object / Relational Mapping (ORM) làm giảm không tương hỗ phương pháp phát triển hướng đối tượng nhà phát triển NET giới sở 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 ứng dụng, sử dụng kỹ thuật hướng đối tượng quen thuộc.Cho phép nhà phát triển dể dàng làm việc với liệu quan hệ đối tượng domain-specific, loại bỏ khó khăn việc truy cập liệu trước Bằng cách sử dụng Entity Framework, truy vấn LINQ, việc lấy thao tác liệu đối tượng trở nên mạnh mẽ Entity Framework ORM cung cấp dịch vụ change tracking, idenity resolution, lazay loading, truy vấn liệu tập trung vào business logic ứng dụng O/RM ORM kỹ thuật chuyển đổi liệu hệ thống khác (không phải mơ hình hướng đối tượng) sang đối tượng ngơn ngữ lập trình hướng đối tượng Trong trường hợp chuyển liệu từ dòng liệu CSDL quan hệ sang đối tượng Tìm hiểu thêm O/RM B O/RM gì? O/RM cơng cụ để lưu liệu từ domain objects tới quan hệ liệu MS SQL Server, tự động hóa O/RM gồm phần chính: Domain class objects, Relational database objects, Mapping information on how domain objects map to relational database objects (table, views, storedprocedures) O/RM giúp tách riêng database domain class để dễ phát triển maintain Hiểu đơn giản hơn, ORM cộng cụ để generate class từ database: Có nhiều ORM frameworks dành cho net thị trường là: DataObjects.Net, NHibernate, OpenAccess, SubSonic Lưu ý: Entity Framework mã nguồn mở ORM framework Microsoft C Tại nên sử dụng LinQ hay Entity Framework Với SQLExpress để truy vấn liệu ta phải dùng đến câu lệnh Query phức tạp Hơn để sử dụng ứng dụng C# lại thêm tầng phức tạp với câu lệnh: dùng ConnectionString khởi tạo kết nối tới DataBase, tự khai báo biến để chạy lệnh - command, phải tính toán đầu câu lệnh Thật q phức tạp ta có chương trình "khủng" Vậy để giải vấn đề này? Lợi ích lớn EF 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 tương tác với sở liệu EF Microsoft hỗ trợ phát triển lâu dài bền vững, EF framework mạnh để phát triển ứng dụng Web với hỗ trợ đông đảo 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 EF Runtime A EF Tools dành cho Visual Studio EF6 Tools thêm vào từ phiên VS 2013 Nếu bạn sử dụng phiên VS 2012 cài đặt (Bạn phải đảm bảo Microsoft Web Developer Tools Microsoft SQL Server Data Tools cài đặt trước cài đặt EF Tools) B EF Runtime Phiên Entity Framework có NuGet Cài đặt EF Nuget Package Bạn cài EF package cách click phải vào folder References chọn Manage NuGet Packages … Để cài Entity Framework, bạn nhấn chuột phải vào thư mục References (hoặc bin) dự án Web chọn Manage NuGet Packages Sau bạn tìm cài đặt gói Entity Framework vào dự án Web Cài đặt gói EF dòng lệnh (Package Manger Console) Bạn chọn thư mục cần cài đặt EF (bin References), sau chọn menu Tools -> Library Package Manager -> Package Manager Console hình Ở phần dòng lệnh đáy công cụ, bạn gõ: Install-Package EntityFramework Cài đặt EF Để cài đặt phiên EF nhất, bạn chọn Include Prerelease cửa sổ Manage NuGet Package III Kiến trúc Entity Framework Có tầng ứng dụng Entity Framework: - Tầng model Tầng object Tầng model có thành phần: - - - Mơ hình khái niệm Conceptual – Conceptual Schema Definition Language (CSDL): ngôn ngữ định nghĩa entity, relationship, hàm tập tin với phần mở rộng csdl Có thể tạo entity class (object layer) Mơ hình khái niệm chứa lớp mơ hình mối quan hệ lớp Điều để độc lập với mơ hình quan hệ bảng database Mơ hình ánh xạ Mapping – Mapping specification language (MSL): định nghĩa ánh xạ lớp conceptual logical, nội dung lưu tập tin msl Mơ hình ánh xạ gồm thơng tin cách mơ hình khái niệm ánh xạ đến mơ hình lưu trữ Mơ hình lưu trữ Logical – Store Schema Definition Language (SSDL): định nghĩa mơ hình lưu trữ liệu, lưu trữ tập tin ssdl Mơ hình lưu trữ mơ hình thiết kế database bao gồm bảng, view, stored procedure (thủ tục), mối quan hệ chúng khóa Mơ hình thể gần giống mơ hình quan hệ bảng database A Application Application (ứng dụng) tầng chứa giao diện trang Web (HTML, CSS, Javascript, hình ảnh, …) đoạn mã nguồn (C#, VB) để tương tác liệu với tầng khác mơ hình thông qua Object Services B Object Services Object Services (tạm dịch dịch vụ đối tượng) tầng chứa trình tương tác ứng dụng database, hay nói cách khác nơi chủ yếu để truy cập liệu từ database trả ngược kết giao diện Object Services cung cấp tiện ích để truy vết thay đổi quản lý nhận dạng, đồng thời quan hệ thay đổi database Đây class tự động sinh tương ứng với mơ hình liệu Các class bao gồm: ▪ ▪ ▪ ▪ Ta EF: ObjectContext đại diện cho database ObjectContext có chức quản lý kết nối, định nghĩa mơ hình liệu với metadata thao tác với database Lớp thêm vào phương thức đại diện cho stored procedure database ObjectSet một tập hợp entity Mỗi đối tượng tương ứng với table Có thể lấy đối tượng thơng qua property tương ứng ObjectContext EntityObject, ComplexObject lớp tương ứng cho dòng liệu table database Khác biệt hai loại ComplexObject không chứa primary key EntityCollection EntityReference: đối tượng thể mối quan hệ (relationship) hai entity class Mỗi đối tượng truy xuất thơng qua property entity class có bảng ánh xạ tương đương sau đối tượng database Database Object Entity Framework Object Database ObjectContext Table, View EntityObject, ComplexObject Column Property Relationship EntityCollection, EntityReference Ví dụ sau cho thấy cách tạo đối tượng ObjectContext từ mơ hình liệu ProductDBEntities (tên connection string lưu app.config), 10 Kết luận: Đến đây, bạn học cách tạo ứng dụng theo phương pháp tạo mã nguồn trước, gieo database sau (Code First to a New Database) Tiếp đến, bạn nắm cách tạo lưu trữ liệu database cách dùng Code First Migrations để thay đổi mơ hình, cấu hình mơ hình thơng Data Annotations Fluent API 10 So sánh Code First Data Code First Database First Viết class Model code C# Generate Database từ class Model Generate Model từ Database Các class Model ko phép chỉnh sửa 11 Ưu điểm nhược điểm Code First Database First 62 Rất phổ biến (vì lập trình viên thường khơng thích thiết kế DB, thích thiết kế class) Kiểm sốt hồn tồn code model, thêm xóa sửa thuộc tính vơ dễ dàng Ưu điểm Không phải nặng đầu suy nghĩ DB Đối với cách tiếp cận này, DB “cục” data, lơi xài thơi Ít phổ biến DB develop riêng Dùng DB có sẵn Entity Framework tạo Entity class cho bạn Có thể version control Database Khơng thể thay đổi code Generate (nó lần chỉnh sửa cấu trúc DB tiếp theo) Các thay đổi cấu trúc trực tiếp DB Nhược điểm Khó kiểm sốt column tạo Db Bạn phải nhức đầu suy nghĩ muốn biểu diễn kiểu quan hệ cha class Mỗi lần thay đổi cấu trúc DB, bạn phải update lại EDMX tạo lại class Model để phản ánh thay đổi Hơi khó kết hợp với Db có sẵn 12 Khó khăn muốn thêm DataAttribute DisplayAttribute cho class model Tương lai cho ASP.NET Core? ADO.NET Entity Framework (EF) Microsoft đưa từ phiên NET 3.5 tích hợp với Visual Studio 2008 Trọng tâm EF Entity Data Model, mơ hình mẫu cho application domain bạn ánh xạ ngược trở lại vào đồ hình (schema) CSDL bạn Mơ hình mẫu mơ tả lớp (core class) ứng dụng bạn EF sử dụng mơ hình mẫu truy vấn từ CSDL, tạo đối tượng từ liệu sau đưa thay đổi ngược trở lại vào CSDL Việc mơ hình hóa (modeling) với Entity Framework trước có Code First Phiên EF cho phép lập trình viên tạo mơ hình mẫu cách reverse engineering CSDL có vào tập tin XML Tập tin XML sử dụng phần mở rộng EDMX bạn sử dụng designer để xem tinh chỉnh mơ hình cho thích hợp với domain bạn Visual Studio 2010 NET mang đến phiên thứ EF, đặt tên Entity Framewoork (EF4), để phù hợp với phiên NET Về mặt mơ hình hóa, tính gọi Model First đưa vào Tại đây, bạn thiết kế mơ hình mẫu bạn visual designer sau tạo CSDL dựa mơ hình Model First cho phép lập trình viên làm việc project mà phụ thuộc vào liệu để tận dụng khả EF Lập trình viên bắt 63 đầu với việc tập trung vào application domain việc thiết kế mơ hình mẫu để CSDL tự động tạo theo quy trình Dù cho việc thiết kế EDMX theo hướng database-first hay model-first, bước để tạo domain việc tạo code tự động tạo lớp dựa thực thể mối liên hệ chúng mà tìm thấy model Từ đây, lập trình viên có strongly typed class đại diện cho domain object tiếp tục việc phát triển ứng dụng xoay quanh class Một thay đổi lớn khác phiên EF4 NET 3.5, cách EF quản lý đối tượng vùng nhớ (in-memory object) yêu cầu lớp phải kế thừa từ EntityObject EF EntityObject theo dõi thay đổi có khả đẩy ngược chúng lại CSDL Theo tính này, NET giới thiệu POCO (Plain Old CLR Object) hỗ trợ EF theo dõi thay đổi cho lớp đơn giản mà không cần EntityObject phải thực thi Hello Code First Được xây dựng dựa thành phần giới thiệu EF4, Code First cho phép lập trình viên định nghĩa domain model với code thay phải sử dụng tập tin EDMX Mặc dù Model First Database First sử dụng code generation để cung cấp class cho bạn làm việc, nhiều lập trình viên khơng muốn làm việc với designer class tạo từ chúng Trong Code First, bạn bắt đầu việc định nghĩa domain model bạn việc sử dụng POCO class khơng phụ thuộc vào EF Code First bao hàm nhiều thông tin model từ class bạn Bạn cung cấp cấu hình bổ sung để mơ tả model override mà Code First cung cấp Phần cấu hình thực code tập tin XML hay designer EF4 hỗ trợ POCO class làm việc với designer EF cung cấp POCO template cho phép tạo POCO class Những class cập nhật tự động bạn thay đổi designer Bạn sử dụng POCO class mình, bạn chọn cách bạn phải chấp nhận việc đồng hóa class bạn tập tin EDMX Điều có nghĩa việc thay đổi phải thực nơi: designer, class bạn Một thuận lợi lớn Code First class bạn trở thành model, điều có nghĩa thay đổi cho model cần thực nơi – POCO class bạn Code First, Model First Database First cách để xây dựng Entity Data Model để sử dụng với EF để thực việc truy cập liệu 64 Microsoft đưa tùy chọn Database First, Model First Code First workflow thực tùy chọn bao gồm tập bước bạn tự thực hay tự động Khi phát triển ứng dụng phần mềm nói chung, hẳn bạn quen với việc khảo sát trang, phân tích yêu cầu đầu vào, vẽ sơ đồ Use Case, sơ đồ lớp, … sau thiết kế sở liệu trước bắt tay vào lập trình xây dựng chương trình Tuy nhiên, cách tiếp cận truyền thống số trường hợp khơng phù hợp Một cách khác, thường hay làm mà để ý thiết kế mã nguồn chương trình trước, sau gieo sở liệu sau Nội dung trình bày vấn đề với việc sử dụng Entity Framework 65 Vậy việc tạo CSDL ban đầu xong, bạn thêm record mẫu cho bảng Sau kiểm tra xem Bounded Context có truy xuất đến database hay khơng cách viết hàm sau vào tập tin Program.cs: public static bool CanRetrieveInfoFromBlogContext() { var context = new BlogContext(); Debug.WriteLine(context.Database.Connection.ConnectionString); return context.Blogs.Any(); } Sau gọi hàm hàm Main xem kết 66 Oh oh, lỗi Lý mã nguồn BaseContext class, khai báo khơng CSDL cần truy xuất, “BoundedContextDemo”, CSDL truy xuất “DemoDatabaseInitialization.DemoDatabaseModel” mặc định Code First tạo Việc đơn giản việc khai báo lại tên CSDL BaseContext class build lại solution protected BaseContext() : base("DemoDatabaseInitialization.DemoDatabaseModel") { } Kết Bây thử kiểm tra xem Bounded Context có lấy đượct thông tin từ CSDL hay không cách viết thêm hàm sau: public static Post GetTheFirstRecordFromPostTable() { Post post = new Post(); var context = new BlogContext(); 67 post = context.Posts.FirstOrDefault(); return post; } Sau gọi hàm hàm Main, build solution xem kết Console.WriteLine(GetTheFirstRecordFromPostTable().Title; Hurray, lấy Như vậy, đến bạn hiểu phần Bounded Context gì, mục đích sử dụng Domain Driven Design Chúc bạn tạo ứng dụng tốt với EF Code First D Tạo EDM theo hướng Code First (Step by Step) sử dụng CSDL có sẵn Code First tức bạn phải code sau sinh Database từ code Nhưng Database tạo thuộc tính: ràng buộc, identity, unique Giải pháp tạo database hồn chỉnh SQL sau viết code để map CSDL với Entity Trước hết tạo class mô tả bảng CSDL chúng ta, bao gồm trường thuộc tính, kiều chúng public partial class tbLop { [Key] [DatabaseGenerated(DatabaseGeneratedOption.None)] public int IdLop { get; set; } [StringLength(50)] public string Lop { get; set; } } 68 10 11 12 13 14 15 16 17 18 19 20 21 22 public partial class tbHocVien { [Key] public int IdHocVien { get; set; } public int? IdLop { get; set; } [StringLength(50)] public string HoTen { get; set; } [Column(TypeName = "date")] public DateTime? NgaySinh { get; set; } } Danh sách annotation mà EF hỗ trợ bao gồm: ● ● ● ● ● ● ● ● ● ● ● ● ● KeyAttribute StringLengthAttribute MaxLengthAttribute ConcurrencyCheckAttribute RequiredAttribute TimestampAttribute ComplexTypeAttribute ColumnAttribute Placed on a property to specify the column name, ordinal & data type TableAttribute Placed on a class to specify the table name and schema InversePropertyAttribute Placed on a navigation property to specify the property that represents the other end of a relationship ForeignKeyAttribute Placed on a navigation property to specify the property that represents the foreign key of the relationship DatabaseGeneratedAttribute Placed on a property to specify how the database generates a value for the property (Identity, Computed or None) NotMappedAttribute Placed on a property or class to exclude it from the database 69 Sau tạo class Context - class quản lý tất bảng giao tiếp với Entity, tương tự class DataContext LINQ to SQL 10 11 12 13 14 public partial class DataContext : DbContext { /// /// Connection string lưu App.config /// theo name="DataContext" /// public DataContext() : base("name=DataContext") { } public virtual DbSet tbHocViens { get; set; } public virtual DbSet tbLops { get; set; } } Trong App.config ta thiết đặt ConnectionString để class Conext liên kết với CSDL có sẵn dễ dàng thay đổi thay đổi CSDL ’’ADO.NET: công nghệ mircosoft, nghĩ cũ lạc hậu Nghĩ tới cảnh ngồi cộng chuỗi từ câu lệnh sql thấy nản Dĩ nhiên đầu nên làm quen LINGQ: cải tiến tí xíu Chạy trực tiếp câu sql có điểm yếu thay đổi cấu trúc database tên filed phải ngồi sửa ADO.NET ENTITY: map ngun database vào nên khơng lo viết câu sql, không lo thay đổi cấu trúc, số filed.’’ X References ● Document trang MSDN Entity Framework Microsoft cung cấp: ● Series tutorials dammio.com ● Series tutorials YinYang’s Programming Blog ● Tutorial blog NVNhan 76 ... Database Object Entity Framework Object Database ObjectContext Table, View EntityObject, ComplexObject Column Property Relationship EntityCollection, EntityReference Ví dụ sau... Install-Package EntityFramework Cài đặt EF Để cài đặt phiên EF nhất, bạn chọn Include Prerelease cửa sổ Manage NuGet Package III Kiến trúc Entity Framework Có tầng ứng dụng Entity Framework: - Tầng... không chứa primary key EntityCollection EntityReference: đối tượng thể mối quan hệ (relationship) hai entity class Mỗi đối tượng truy xuất thơng qua property entity class có bảng