Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 50 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
50
Dung lượng
1,25 MB
Nội dung
GIÁOTRÌNHLẬPTRÌNHCƠSỞDỮLIỆU C# VỚILINQ - ENTITYFRAMEWORK MỤC LỤC Giới thiệu Linq - EF 1.1 Giới thiệu Linq 1.2 Môi trường thực hành ví dụ , quản lý Project Visual Studio Xử lý lớp List Linq 2.1 Giới thiệu 2.2 Tạo lớp liệu : 2.3 Một vài truy vấn : 10 2.4 Truy vấn trả kết 11 Xây dựng mô hình liệu 11 3.1 Cấu hình thư viện EF 11 3.2 Xây dựng mô hình CSDL EF code first 15 (1) Tạo lớp định nghĩa CSDL 15 (2) Xây dựng lớp ánh xạ CSDL sau : 15 (3) Tạo liệu mặc định : 16 (4) Khai báo chuỗi kết nối : 16 (5) Chạy Test thử ứng dụng 16 3.3 Xây dựng mô hình CSDL EF Database First 19 (1) Khởi tạo mô hình liệu 19 (2) Chạy thử ví dụ 25 3.4 Xây dựng mô hình CSDL Linq to Sql 27 (1) Xây dựng mô hình 27 (2) Chạy thử ví dụ 33 Truy vấn Linqvới Entity Framework 33 4.1 Truy vấn lấy liệu 34 4.2 Thêm xóa đối tượng 34 4.3 Sửa đối tượng 35 4.4 Xóa đối tượng 36 Bảng chứa mối quan hệ Entity Framework 36 5.1 Tạo bảng chứa mối quan hệ 36 5.2 Khai báo liệu mặc định 37 5.3 Truy vấn liệu bảng chứa mối quan hệ 37 5.4 Nhận xét : 39 5.5 Bảng liệu quan hệ n - n Entity Framework 40 6.Lựa chọn CSDL mô hình phát triển ứng dụng 43 6.1 Chọn loại CSDL 43 6.2 Lậptrình CSDL 44 Tích hợp CSDL Sql Compact vào Project 45 7.1 Giới thiệu 45 7.2 Hướng dẫn tích hợp 45 (1) Copy thư viện amd64 x86 45 (2) Tham chiếu thư viện dll Sql Compact vào Project 46 (3) Copy thư viện Sql Compact 48 (4) Đăng ký thư viện web.config , App.Config 50 Giới thiệu Linq - EF 1.1 Giới thiệu Linq - Có thể nói Linq - Entity Framework thư viện lậptrình CSDL hướng đối tượng, giúp đơn giản hóa trình kết nối , xử lý liệu - VớiLinq – Entity Framework hay Linq to sql bạn hoàn toàn không cần học tới khái niệm Ado.net , TSql để viết ứng dụng CSDL cách đơn giản , đại , hướng đối tượng mạnh mẽ - Phiên trước Linq to sql mô hình ORM hỗ trợ lậptrình CSDL hướng đối tượng mạnh mẽ - VớiLinq - Entity Framework bạn truy vấn liệu xử lý đối tượng C# thông thường Và bạn hoàn toàn quyên truy vấn T-Sql - Các đối tượng truy vấn trả đối tượng hướng đối tượng lớp liệu tương ứng với bảng liệu nên việc thao tác hiển thị lên giao diện đơn giản - Không đối tượng DataTable , Dataset ADO.NET hoàn toàn trừu tượng vớigiao diện ,chúng ta phải chuyển đối tượng thực tế bảng liệu hiển thị , binding lên giao diện VớiLinq - Entity Framework hiển thị , binding trực tiếp lên giao diện - Hoặc vớilậptrình web ta hoàn toàn dễ dàng chuyển đối tượng trả truy vấn linq - Entity Framework thành đối tượng lậptrình web jSon , xml , javascript,html đối tượng hay dùng lậptrình ajax , web nói chung - Nếu bạn người học lậptrình CSDL học Linq – Entity Framework mà bỏ qua ADO.NET hay TSql.Còn bạn người lậptrình Ado.net , TSql khuyên bạn chuyển sang Linq – Entity Framework Vì Linq – Entity Framework tảng lậptrình CSDL hướng đối tượng mạnh mẽ đơn giản – thống nhiều sovới Ado.net T Sql - Việc nắm vững Linq - Entity Framework lậptrình CSDL kiến thức quan trọng lậptrình net cho dù bạn người phát triển ứng dụng web , desktop 1.2 Môi trường thực hành ví dụ , quản lý Project Visual Studio - Để thực hành nội dung kiến thức , viết ứng dụng net Microsoft cung cấp IDE phát triển ứng dụng mạnh Visual Studio.Hiện có phiên VS 2013 Preview Trong tài liệu sử dụng phiên VS 2012 để thực hành ví dụ - Các bạn thực hành công cụ khác Nhưng bạn nên nhớ Visual Studio IDE phát triển ứng dụng mạnh cho ứng dụng window hay ứng dụng web - Mục đích cuối viết ứng dụng window ( winform , wpf ) hay ứng dụng web ( webform , mvc ) hay ứng dụng dịch vụ wcf , window service , webservice , web API - Để bạn có tảng cho tất công nghệ hướng dẫn thực hành ứng dụng Console , tảng chủ yếu để viết ví dụ ứng dụng - Khi có hiểu biết Linq mô hình liệu bạn dễ dàng chuyển sang ứng dụng cụ thể winform , wpf , mvc … Tạo Project : Vào File/New/Project Có thể chọn tắt qua trang Start Page sau : Ta cógiao diện quản lý Project hình sau : - Tạo Project Console với thông số sau : ( tạo ứng dụng winform , wpf , webform , mvc tương tự ) Giao diện ứng dụng VS sinh mã : Ví dụ tạo thư mục Project Chuột phải Project chọn sau : Ví dụ tạo class Project Chọn thông số hình sau : Lớp Product tạo namespace ConsoleApp { class Product { } } Chú ý Name Space lớp tạo trùng với tên Project , đổi Name Space tùy thích để dễ quản lý Xử lý lớp List Linq 2.1 Giới thiệu - Lậptrình CSDL dùng Entity Framework tương tự việc thao tác xử lý kiểu liệu tập hợp C# - Do cần có kỹ xử lý kiểu liệu tập hợp (thêm,sửa,xóa) Cũng việc lậptrình hướng đối tượng C# - Các bạn nên có kiến thức Linq , đọc tài liệu C# nâng cao để có kiến thức thư viện Linq - Lớp List lớp có sẵn net ,nó thực Interface IEnumable vài interface khác T kiểu liệu hệ thống ( int , string …) kiểu liệu tự tạo ( class ) - Do thực interface Ienumale nên List có đầy đủ thành phần : add , remove , foreach … - Các thao tác xử lý lớp thực interface Ienumable khác tương tự List - Do truy vấn Linqvới Entity Framework trả kiểu liệu IEnumable , lớp List thực Interface , nên việc nắm vững xử lý List giúp bạn nắm Entity Framework 2.2 Tạo lớp liệu : // Tạo lớp Product : public class Product { public int ID { get; set; } public string Name { get; set; } } // ta tạo sẵn phương thức lớp Product để tạo danh sách Product Code lớp product sau : class Product { public int ID { get; set; } public string Name { get; set; } public double Price { get; set; } public static List GetData(int Count) { var ProductList = new List(); for (int i = 1; i m.IDm.ID m.Name == "Product1") ProductList.skip(2) ProductList.take(3) truy vấn trả Product có ID < trả Product có Name Product1 trả danh sách product từ vị trí thứ trở Trả Product - Ở đối tượng Product có ProductID = phải chắn tồn không sinh lỗi Entity Framework không tìm thấy đối tượng cần sửa đổi - Có thể xử lý lỗi ngoại lệ trường hợp 4.4 Xóa đối tượng - Tương tự phương thức Add , để xóa đối tượng ta cần gọi phương thức Remove với tham số truyền vào Product cần xóa - Ví dụ xóa Product có ProductID MyEntity db = new MyEntity(); // Tạo đối tượng Product cần sửa đổi var _Product = db.Products.Find(1); // Xóa đối tượng db.Products.Remove(_Product); // Lưu xuống CSDL db.SaveChanges(); - Entity Framework không hỗ trợ xóa danh sách đối tượng xuống CSDL Tuy nhiên bạn có kiến thức Generic ,Extension Method , Reflection bạn hoàn toàn thêm phương thức để xử lý xóa danh sách đối tượng Bảng chứa mối quan hệ Entity Framework - Một vấn đề quan trong ứng dụng CSDL liệucó quan hệ với - Với mô hình Entity Framework database first Linq to sql VS tự động sinh lớp có mối quan hệ với - Chúng ta quan tâm tới việc xây dựng bảng chứa mối quan hệ mô hình Entity Framework code first 5.1 Tạo bảng chứa mối quan hệ - Ta có lớp Product (Sản phẩm) với bảng Product tương ứng CSDL - Ta tạo bảng Category (Loại sản phẩm) có quan hệ - n với bảng Product - Để tiện truy vấn ta thay đổi mã lớp Product sau : Lớp Product public class Product { public int ProductID { get; set; } public string ProductName { get; set; } public int CategoryID { get; set; } public virtual Category Category { get; set; } } Lớp Category public class Category { public int CategoryID { get; set; } public string CategoryName { get; set; } public virtual ICollection Products { get; set; } } - Lớp Category có quan hệ - n với lớp Product ( Category có nhiều Product) - Lớp Category có thuộc tính ảo Products để truy vấn tới danh sách sản phẩm thuộc Category - Lớp Product có thuộc tính ảo Category để truy vấn lớp lớp Category - Khi sinh bảng CSDL , Entity Framework tự động sinh bảng phụ chứa mã bảng để liên kết bảng - Ta thay ICollection đối tượng thể cụ thể List - Trong truy vấn Linq , từ Category dễ dàng truy vấn tới Product Category Hoặc từ Product dễ dàng truy vấn tới Category chứa Product - Khai báo lớp Category lớp Entity định nghĩa CSDL sau : public class MyEntity : DbContext { public DbSet Products { get; set; } public DbSet Categorys { get; set; } protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.Conventions.Remove(); } } 5.2 Khai báo liệu mặc định - Ta khai báo liệu mặc định file DefaultData.cs sau : public class DefaultData : DropCreateDatabaseIfModelChanges { protected override void Seed(MyEntity context) { #region Danh sách Category new List { new Category{ CategoryID=1, CategoryName = "Category 1"}, new Category{ CategoryID=2, CategoryName = "Category 2"}, new Category{ CategoryID=3, CategoryName = "Category 3"} }.ForEach(m=>context.Categorys.Add(m)); #endregion #region Tạo danh sách Product new List { new Product { ProductID =1 , ProductName = "Product 1", CategoryID=1}, new Product { ProductID =2 , ProductName = "Product 2", CategoryID=1}, new Product { ProductID =3 , ProductName = "Product 3",CategoryID=2}, new Product { ProductID =4 , ProductName = "Product 4",CategoryID=2}, new Product { ProductID =5 , ProductName = "Product 5", CategoryID=3} }.ForEach(m => context.Products.Add(m)); #endregion } } 5.3 Truy vấn liệu bảng chứa mối quan hệ - Ví dụ truy vấn lấy Category có mã , Product thuộc Category - Do lần đầu chạy lại ví dụcó thay đổi cấu trúc liệu ta cần xóa bỏ file Database cũ thư mục bin, đồng thời khai báo khởi tạo database sau phương thức main lớp Program Database.SetInitializer(new DefaultData()); Lấy Category có mã , Product Category : class Program { static void Main(string[] args) { Database.SetInitializer(new DefaultData()); MyEntity db = new MyEntity(); var _Category1 = db.Categorys.Find(1); var _Product1 = _Category1.Products; Console.WriteLine(_Category1.CategoryName); // hiển thị test thử foreach (var item in _Product1) { Console.WriteLine(item.ProductName); } Console.Read(); } } Chạy ứng dụng dược kết sau : Lấy Category Product - Từ Product lấy thông tin Categry chứa sau : class Program { static void Main(string[] args) { MyEntity db = new MyEntity(); // lấy Product có mã var _Product1 = db.Products.Find(1); // Category tương ứng var _Category1 = _Product1.Category; // hiển thị tên Product Console.WriteLine(_Product1.ProductName); // hiển thị tên Category tương ứng Console.WriteLine(_Category1.CategoryName); Console.Read(); } } - Chạy ví dụ kết hiển thị sau : 5.4 Nhận xét : - CSDL mà Entity Framework tạo có cấu trúc sau : (Các bạn mở File SampleDB.sdf hướng dẫn phần Entity Framework code first ) - Trong nhiều trường hợp Entity Framework tự động tạo bảng phụ lưu trữ khóa để trì mối quan hệ - Việc truy vấn bảng chứa mối quan hệ Entity Framework code first đơn giản - Từ bảng dễ dàng truy vấn đối tượng bảng ngược lại Dễ dàng truy vấn thông tin đối tượng thuộc cha biết liệu bảng - Trong nhiều trường hợp ta truy vấn theo ID bảng cha theo kiểu truy vấn so khớp sau : Lấy tất Product có CategoryID class Program { static void Main(string[] args) { // Database.SetInitializer(new DefaultData()); MyEntity db = new MyEntity(); var _Product1 = db.Products.Where(m=>m.CategoryID==1); // hiển thị test thử foreach (var item in _Product1) { Console.WriteLine(item.ProductName); } Console.Read(); } } - Kết chạy sau : 5.5 Bảng liệu quan hệ n - n Entity Framework - Ở ta khai báo bảng liệu - n , việc khai báo bảng liệu chứa quan hệ n - n hoàn toàn tương tự khai báo quan hệ - n - Khi khai báo quan hệ n - n Entity Framework tự động sinh bảng liệu phụ lưu trữ khóa quan hệ - Giả sử ta có bảng Product ( Sản phẩm ) bảng Customer ( khách hàng ) có quan hệ n - n khách hàng mua nhiều sản phẩm sản phẩm mua nhiều khách hàng Ta code lại lớp Product thêm Customer sau : public class Product { public int ProductID { get; set; } public string ProductName { get; set; } public int CategoryID { get; set; } public virtual Category Category { get; set; } public virtual ICollection Customers { get; set; } } public class Customer { public int ID { get; set; } public string Name { get; set; } public virtual ICollection Products { get; set; } } - Lớp Customer có thuộc tính ảo Products để truy vấn tới lớp Product ngược lại - Lớp Product có thuộc tính ảo Customers để truy vấn tới lớp Customer - Và ta thấy việc từ lớp Customer truy vấn sang lớp Product ngược lại đơn giản Đăng ký lớp Customer với lớp Entity public class MyEntity : DbContext { public DbSet Products { get; set; } public DbSet Categorys { get; set; } public DbSet Customers { get; set; } protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.Conventions.Remove(); } } Khai báo liệu mặc định - Ta thay đổi chút mã tạo liệu bảng Product - Ở ta tạo Customer mua danh sách sản phẩm #region Tạo danh sách Product List lstProduct = new List { new Product { ProductID =1 , ProductName = "Product 1", CategoryID=1}, new Product { ProductID =2 , ProductName = "Product 2", CategoryID=1}, new Product { ProductID =3 , ProductName = "Product 3",CategoryID=2}, new Product { ProductID =4 , ProductName = "Product 4",CategoryID=2}, new Product { ProductID =5 , ProductName = "Product 5", CategoryID=3} }; lstProduct.ForEach(m => context.Products.Add(m)); #endregion #region Customer new List { new Customer { ID=1 , Name="Customer 1", Products=lstProduct.Take(2).ToList()}, new Customer {ID=2,Name="Customer 2", Products=lstProduct.ToList()} }.ForEach(m=>context.Customers.Add(m)); #endregion Khởi chạy tạo liệu Thay đổi mã lớp Program sau : class Program { static void Main(string[] args) { Database.SetInitializer(new DefaultData()); MyEntity db = new MyEntity(); var _Customer = db.Customers.Find(1); Console.WriteLine(_Customer.Name); // hiển thị test thử foreach (var item in _Customer.Products) { Console.WriteLine(item.ProductName); } Console.Read(); } } - Ta hiển thị Customer có mã , đồng thời hiển thị tên Product mà Customer mua , kết chạy sau : Cấu trúc CSDL SampleDB sau : - Ta ý tới bảng CustomerProduct Đây bảng phụ lưu trữ khóa Product Customer để tạo mối quan hệ n - n cho bảng 6.Lựa chọn CSDL mô hình phát triển ứng dụng 6.1 Chọn loại CSDL Dùlậptrình window App ( wpf , winform) hay ứng dụng web triển khai CSDL khác phù hợp với yêu cầu phát triển ứng dụng Hiện có tảng CSDL hay dùng sau : - Sql Compact - Sql Server - Sql Local Mỗi loại có ưu nhược điểm sau : Sql Compact : - hệ CSDL nhỏ gọn ( tối đa Gb liệu ), hoàn toàn miễn phí - Chỉ kết nối tới file - Không cần cài đặt Sql Compact Có thể tích hợp vào phần ứng dung Vì triển khai ứng dụng window hay web không cần cấu hình cài đặt sql server hay chuỗi kết nối Nên việc triển khai đơn giản loại CSDL khác.Giả sử bạn dùng CSDL Sql compact , tích hợp chúng vào ứng dụng web Khi upload web lên hosting , cần hosting cài net framework website bạn chạy - Không cần cấu hình chuỗi kết nối khác máy tính khác Sql Server ( Express ) : - tối đa Gb liệu ( miễn phí ) - kết nối tới máy chủ chứa CSDL - tích hợp vào ứng dụng , triển khai cần cài đặt máy chủ sql server - cần cấu hình chuỗi kết nối dựa vào máy - Có thể nâng cấp nên trả phí hỗ trợ không giới hạn dung lượng Sql Local : - tối đa Gb liệu - cần cài đặt Sql Local - Không cần cấu hình thay đổi chuỗi kết nối với ứng dụng khác - attach vào Sql server để chạy Sql Server Với Sql Compact Sql Local có điểm yếu không phục lượng kết nối lớn Với website có tới hàng nghìn người truy cập thời điểm thi không nên dùng Sql Compact không hỗ trợ Triger , procedure Giải pháp : Với ứng dụng doanh nghiệp nên chuyển sạng dùng sql Compact để triển khai tính đơn giản ( không cần cài đặt máy chủ CSDL ) không phát sinh lỗi kết nối CSDL Hầu máy chủ Sql Compact đáp ứng tốt lượng truy cập tương đối lớn đủ ứng dụng Destop App ( phần ứng dụng web ) - Sql server triển khai phức tạp gây phát sinh lỗi Và thêm điều cài đặt làm tăng tài nguyên máy khách hàng Với ứng dụng phần mềm kế toán , quản lý bán hàng , nhà hàng nên dùng sql Compact Sql server Sql Local giải pháp nằm loại , khắc phục nhược điểm loại đồng thời kế thừa nhược điểm loại 6.2 Lậptrình CSDL - VớiLinq – Entity Framework hay Linq to sql bạn hoàn toàn không cần học tới khái niệm Ado.net , TSql để viết ứng dụng CSDL cách đơn giản , đại , hướng đối tượng mạnh mẽ - Dùng Entity Framework : Có thể dùng code first , model first , database first Cả kỹ thuật hỗ trợ truy vấn Linq Mô hình nhiều lậptrình viên sử dụng Code first , có khả tùy biến quản lý code dễ dàng sóvới mã máy sinh lớp đối tượng cách tự động - Dùng Linq to sql Thế hệ trước Entity Framework , hỗ trợ linqLinq to sql tương tự EF database first , nhiên EF có nhiều cải tiến - ADO Net : dùng net 2.0 , dĩ nhiên ko dùng ado.net Một ý dùng dùng Linq to sql hay EF truy vấn cuối Ado.net Các thư viện EF , Linq to sql thay giúp ta convert truy vấn linq chuyển sang truy vấn Ado.net Vì thể hiểu chất ado.net giúp ta hiểu chất việc kết nối liệu - Có lẽ dùng Linq - Entity Framework thay hoàn hảo việc lậptrình ứng dụng web (webform , mvc) hay desktop App ( winform , wpf ) Đặc biệt wpf hỗ trợ chế binding mô hình MVVM hỗ trợ mạnh thao tác binding quản lý liệu đối tượng CSDL đối tượng hiển thị giao diện - Có thể nói Linq - Entity Framework , Sql Compact lựa chọn tương đối hoàn chỉnh cho việc phát triển nhanh ứng dụng window , web net Tích hợp CSDL Sql Compact vào Project 7.1 Giới thiệu - Các bạn thấy tiện tích việc dùng Sql Compact sovới Sql Server - Trong lậptrình web trở ngại lớn nhà cung cấp dịch vụ hosting Việt Nam chưa hỗ trợ CSDL Do họ không cài Sql Compact máy chủ họ - Chúng ta tích hợp Sql Compact vào thành phần Project Thì không cần hosting (máy chủ) cài đặt Sql Compact , hay máy chạy ứng dụng winform , wpf tích hợp sql compact để máy khách hàng không cần cài đặt phần mềm CSDL gây bất tiện cho người dung - Việc tích hợp đơn giản tiện lợi ta không cần phải quan tâm tới CSDL , chuỗi kết nối Chỉ cần Upload web lên hosting chạy với ứng dụng web, với ứng dụng window bạn cần cài đặt gói thư viện ứng dụng chạy không cần cài đặt Sql Compact - Ngoài tích hợp Sql Compact vào Project nên bạn thuê gói cước hosting không cần CSDL ( no sql ) 7.2 Hướng dẫn tích hợp (1) Copy thư viện amd64 x86 - Mở thư mục cài đặt Sql Compact C:\Program Files\Microsoft SQL Server Compact Edition\v4.0\Private - Coppy thư mục amd64 x86 vào thư mục bin Project ( thư viện hỗ trợ hệ điều hành 32 64 bit ) Chú ý : Khi cài đặt VSs 2012 mặc định Sql Compact 4.0 cài đặt theo Nếu lý mà Sql Compact chưa cài đặt máy tính bạn bạn download Sql Compact trang chủ Microsoft cài đặt (2) Tham chiếu thư viện dll Sql Compact vào Project - Add References thư viện sau vào Project : System.Data.SqlServerCe.dll System.Data.SqlServerCe.Entity.dll - thư viện nằm thư mục cài đặt Sql Compact với đường dẫn sau : C:\Program Files\Microsoft SQL Server Compact Edition\v4.0\Private - Tìm đường dẫn tới thư viện dll : - Được kết hình sau : (3) Copy thư viện Sql Compact Mở thư mục : C:\Program Files\Microsoft SQL Server Compact Edition\v4.0 - Copy thư viện sau vào thư mục bin Project : sqlceca40.dll sqlcecompact40.dll sqlceer40EN.dll sqlceme40.dll sqlceoledb40.dll sqlceqp40.dll sqlcese40.dll - đặt thuộc tính copy always project cho thư viện Điều có nghĩa thư viện coppy vào project public project - Cách đặt thuộc tính hình sau : Chuột phải vào thư viện chọn Properties Chọn thuộc tính Coppy Always hình sau : (4) Đăng ký thư viện web.config , App.Config - Mở file webconfig App.Config - Trong thẻ < /configureation> thêm mã sau : ... đối tượng C# - C c bạn nên c kiến th c Linq , đ c tài liệu C# nâng cao để c kiến th c thư viện Linq - Lớp List lớp c sẵn net ,nó th c Interface IEnumable vài interface kh c T kiểu liệu hệ... List Linq 2.1 Giới thiệu - Lập trình CSDL dùng Entity Framework tương tự vi c thao t c xử lý kiểu liệu tập hợp C# - Do c n c kỹ xử lý kiểu liệu tập hợp (thêm,sửa,xóa) C ng vi c lập trình hướng... public class Product { public int ID { get; set; } public string Name { get; set; } } // ta tạo sẵn phương th c lớp Product để tạo danh sách Product Code lớp product sau : class Product { public