Tin tức

Thiết kế web với ASP.NET 4.5 -Tạo lớp truy cập dữ liệu (DAL)

26/01/2013

Hướng dẫn này mô tả làm thế nào để tạo,truy cập, và xem dữ liệu từ một cơ sở dữ liệu bằng cách sử dụng ASP.NET WebForms và mã Entity Framework Đầu tiên. Hướng dẫn này được xây dựng dựa trên hướngdẫn trước "Tạo dự án" và là một phần của chuỗi bài viết về dự ánWingtip Toy Store. Khi đã hoàn thành hướng dẫn này, bạn sẽ có một thư mục mới đặt tên là Models và bạn sẽ có các lớp truy cập dữ liệu dựng sẵn trong thư mục đó. Bạn có thể sử dụng mô hình này để thiết kế web, xây dựng ứng dụng web và các ứng dụng .NET khác.

Bạn sẽ tìm hiểu về:

  • Cách tạo mô hình dữ liệu.
  • Cách khởi tạo và truyxuất cơ sở dữ liệu.
  • Cách thức cập nhật và cấu hình ứng dụng hỗ trợ các cơ sở dữ liệu

Đặc trưng giới thiệu trong phần này bao gồm:

  • Entity Framework CodeFirst
  • LocalDB
  • Dữ liệu chú thích

Tạo mô hình dữ liệu (Data Model)

Entity Framework là một khung giải pháp ánh xạ đối tượng quan hệ (object-relational mapping -ORM). Nó cho phép bạn làm việc với dữ liệu quan hệ như các đối tượng, loại bỏ hầu hết các mã truy cập dữ liệu mà bạn thường cầnphải viết. Sử dụng Entity Framework, bạn có thể truy vấn bằng cách sử dụng ngôn ngữ LINQ, sau đó lấy và thao tác dữ liệu dưới dạng các đối tượng định kiểu. LINQ cung cấp mô hình để truy vấn và cập nhật dữ liệu. Sử dụng EF cho phép bạn tập trung vào việc tạo ra các phần còn lại của ứng dụng, hơn là tập trung vào các nguyên tắc cơ bản truy cập dữ liệu. Ở phần sau trong loạt bài hướng dẫn này, chúng tôi sẽ cho bạn thấy cách sử dụng dữ liệu để điều hướng thao tác và truy vấn sản phẩm.

Entity Framework hỗ trợ mộtmô hình phát triển được gọi là Code First. Code First cho phép bạn xác định cácmô hình dữ liệu của mình bằng cách sử dụng các lớp, sau đó có thể ánh xạ các lớp này vào một cơ sở dữ liệu hiện có hoặc sử dụng chúng để tạo ra một cơ sở dữ liệu. Trong hướng dẫn này, bạn sẽ tạo ra các mô hình dữ liệu bằng cách viết các lớp mô hình dữ liệu. Sau đó, bạn sẽ cho phép Entity Framework tạo ra cơ sở dữ liệu dựa trên các lớp mới này.

Bạn sẽ bắt đầu bằng cách tạo ra các lớp thực thể định nghĩa các mô hình dữ liệu cho các ứng dụng Web Forms. Sau đó, bạn sẽ tạo ra một lớp bối cảnh (context) quản lý các lớp thực thể và cung cấp truy cập dữ liệu vào cơ sở dữ liệu. Bạn cũng sẽ tạo ra một lớp khởi tạo (initializer) mà bạn sẽ sử dụng để thao tác trong cơ sở dữ liệu.

Entity Framework và các tham chiếu

Theo mặc định, EntityFramework được bao gồm khi bạn tạo mới một ứng dụng ASP.NET Web Forms. Entity Framework có thể được cài đặt ,gỡ bỏ, và cập nhật như là một gói NuGet.

Ngoài việc bao gồm Entity Framework trong ứng dụng , bạn phải tham chiếu tới không gian tên System.Data.Entity để có thể truy cập vào các hàm cốt lõi của Entity Framework . Những lớp này cho phép truy vấn, chèn,cập nhật, và xóa dữ liệu.  

  1. Trong Solution Explorer,bấm chuột phải vào References và chọn AddReference từ menu phải.
    Hộp hội thoại ReferenceManager được hiển thị.
  2. Chọn System.Data.Entity từ danh sách hộp hội thoại nếu không thực sự được chọn. Hãy chắc chắn rằng hộp kiểm bên cạnh các mục được chọn.
  3. Bấm OK

Các bước này sẽ thêm assembly System.Data.Entity.dll  vào dự án. Đồng thời cho phép bạn tham chiếu tới không gian tên System.Data.Entity từ bất kỳ đâu trong dự án. 


Các lớp thực thể (Entity Classes)

Các lớp bạn tạo ra để định nghĩa cấu trúc của dữ liệu được gọi là các lớp thực thể. Nếu bạn là người mới để thiết kế cơ sở dữ liệu, bạn có thể hình dung về các lớp thực thể như định nghĩa bảng trong cơ sở dữ liệu. Mỗi thuộc tính trong lớp quy định cụ thể một cột trong bảng của cơ sở dữ liệu. Các lớp này cung cấp giao diện quan hệ đối tượng giữa mã và cấu trúc quan hệ của cơ sở dữ liệu.

Trong hướng dẫn này chúng tasẽ bắt đầu thêm các lớp thực thể đơn giản mô tả lược đồ cho các sản phẩm và danh mục.

  1. Bấm chuột phải lên tên dự án (WingtipToys) trong Solution Explorer và chọn Add -> New Folder.
thiết kế web
2. Đặt tên thư mục mới  là Models.
3. Bấm chuột phải lên thư mục Models và chọn Add -> New Item.
thiet ke web
Hôp hội thoại Add New Item được hiển thị.

4. Phía dưới Visual C# từ ngăn Installed bên trái, chọn Code 
5. Chọn Class từ khung giữa và đặt tên lớp mới là Product.cs 
6. Bấm Add. File lớp mới được hiển thị trong trình soạn thảo.
8. Thay thế mã ngầm định với mã dưới đây:
using System.ComponentModel.DataAnnotations;
 
namespace WingtipToys.Models
{
    public class Product
    {
        [ScaffoldColumn(false)]
        public int ProductID { get; set; }
 
        [Required, StringLength(100), Display(Name = "Name")]
        public string ProductName { get; set; }
 
        [Required, StringLength(10000), Display(Name = "Product Description"), DataType(DataType.MultilineText)]
        public string Description { get; set; }
 
        public string ImagePath { get; set; }
 
        [Display(Name = "Price")]
        public double? UnitPrice { get; set; }
 
        public int? CategoryID { get; set; }
 
        public virtual Category Category { get; set; }
    }
}

8. Lặp lại các bước 3  đến 6,  nhưng thêm một lớp đặt tên Category.cs và thay thế mã mặc định với mã sau:
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
 
namespace WingtipToys.Models
{
    public class Category
    {
        [ScaffoldColumn(false)]
        public int CategoryID { get; set; }
 
        [Required, StringLength(100), Display(Name = "Name")]
        public string CategoryName { get; set; }
 
        [Display(Name = "Product Description")]
        public string Description { get; set; }
 
        public virtual ICollection<Product> Products { get; set; }
    }
}

Lớp  Category mô tả danh mục sản phẩm theo thiết kế ứng dụng (như "Cars", "Boats", "Rockets", v.v…), và lớp  Product mô tả các sản phẩm trong cơ sở dữ liệu. Mỗi thể hiện của  đối tượng Product sẽ tương ứng với một dòng trong một bản gcơ sở dữ liệu, và mỗi thuộc tính của lớp sản phẩm ánh xạ một cột trong bảng.Tiếp theo phần hướng dẫn này bạn sẽ xem lại dữ liệu sản phẩm chứa trong cơ sở dữ liệu.


Dữ liệu thông báo

Bạn có thể được thông báo rằng một số thành viên của các lớp có các thuộc tính xác định các thông tin chi tiết về thành viên, chẳng hạn như [ScaffoldColumn (false)]. Đây là những chú thích dữ liệu. Các dữ liệu thuộc tính chú thích có thể mô tả làm thế nào để xác nhận người dùng nhập vào cho thành viên đó, để chỉ rõ định dạng cho nó, và để xác định cách thưc nó được mô hình hóa.

 Lớp Context

Để bắt đầu sử dụng các lớp truy cập dữ liệu, bạn phải xác định một lớp ngữ cảnh (context). Như đã đề cập trước đây, lớp này quản lý các lớp thực thể và cung cấp truy cập dữ liệu vào cơ sở dữ liệu.

Các bước dưới đây thêm một lớp ngữ cảnh mới của C# vào thư mục Models.

  1. Bấmchuột phải lên thư mục Models sau đó chọn Add -> NewItem
    Hộp thoại Add New Item được hiển thị.
  2. Chọn Code từ khung Installed bên trái.
  3. Chọn Class từ khung giữa và đặt tên là ProductContext.cs.
  4. Bấm Add  ở nút bên dưới hộp hội thoại.
  5. Thay thế mã ngầm định có trong lớp bởi mã dưới đây:
using System.Data.Entity;
namespace WingtipToys.Models
{
    public class ProductContext : DbContext
    {
        public ProductContext() : base("WingtipToys")
        {
        }
        public DbSet<Category> Categories { get; set; }
        public DbSet<Product> Products { get; set; }
    }
}

Mã này thêm không gian tên System.Data.Entityđể bạn có thể truy cập tất cả các hàm năng cốt lõi của Entity Framework, bao gồm khả năng truy vấn, chèn, cập nhật và xóadữ liệu bằng cách làm việc với các đối tượng định kiểu .

 

The ProductContext class represents the Entity Frameworkproduct database context, which handles fetching, storing, and updating Product class instances in the database. The ProductContext classderives from theDbContext baseclass provided by the Entity Framework.

 

Lớp ProductContext môtả ngữ cảnh Entity Framework cho sản phẩm trong cơ sở dữ liệu, theo đó xử lýlấy, lưu trữ và cập nhật thể hiện của lớp Product trong cơ sở dữ liêu. Lớp ProductContext dẫn xuất từ  ừ lớp cơ sở DbContext cung cấp bởi EntityFramework


Lớp khởi tạo

You will need to run somecustom logic to initialize the database the first time the context is used.This will allow seed data to be added to the database so that you canimmediately display products and categories.

Bạn sẽ cần phải chạy một sốlogic tùy chỉnh để khởi tạo cơ sở dữ liệu đầu tiên cho lần đầu tiên sử dụngcontext. Điều này sẽ cho phép các dữ liệu được thêm vào cơ sở dữ liệu để bạn cóthể ngay lập tức hiển thị các chủng loại sản phẩm.

Các bước dưới đây thêm một lớp khoải tạo C# mới vào the mục Models.

  1. Tạo lớp khác và đặt tên nó là ProductDatabaseInitializer.cs.
  2. Thay thế mã ngầm định chứa với mã dưới đây:
using System.Collections.Generic;
using System.Data.Entity;
 
namespace WingtipToys.Models
{
    public class ProductDatabaseInitializer : DropCreateDatabaseIfModelChanges<ProductContext>
    {
        protected override void Seed(ProductContext context)
        {
            GetCategories().ForEach(c => context.Categories.Add(c));
            GetProducts().ForEach(p => context.Products.Add(p));
        }
 
        private static List<Category> GetCategories()
        {
            var categories = new List<Category> {
                new Category
                {
                    CategoryID = 1,
                    CategoryName = "Cars"
                },
                new Category
                {
                    CategoryID = 2,
                    CategoryName = "Planes"
                },
                new Category
                {
                    CategoryID = 3,
                    CategoryName = "Trucks"
                },
                new Category
                {
                    CategoryID = 4,
                    CategoryName = "Boats"
                },
                new Category
                {
                    CategoryID = 5,
                    CategoryName = "Rockets"
                },
            };
 
            return categories;
        }
 
        private static List<Product> GetProducts()
        {
            var products = new List<Product> {
                new Product
                {
                    ProductID = 1,
                    ProductName = "Convertible Car",
                    Description = "This convertible car is fast! The engine is powered by a neutrino based battery (not included)." +
                                  "Power it up and let it go!",
                    ImagePath="carconvert.png",
                    UnitPrice = 22.50,
                    CategoryID = 1
               },
                new Product
                {
                    ProductID = 2,
                    ProductName = "Old-time Car",
                    Description = "There's nothing old about this toy car, except it's looks. Compatible with other old toy cars.",
                    ImagePath="carearly.png",
                    UnitPrice = 15.95,
                     CategoryID = 1
               },
                new Product
                {
                    ProductID = 3,
                    ProductName = "Fast Car",
                    Description = "Yes this car is fast, but it also floats in water.",
                    ImagePath="carfast.png",
                    UnitPrice = 32.99,
                    CategoryID = 1
                },
                new Product
                {
                    ProductID = 4,
                    ProductName = "Super Fast Car",
                    Description = "Use this super fast car to entertain guests. Lights and doors work!",
                    ImagePath="carfaster.png",
                    UnitPrice = 8.95,
                    CategoryID = 1
                },
                new Product
                {
                    ProductID = 5,
                    ProductName = "Old Style Racer",
                    Description = "This old style racer can fly (with user assistance). Gravity controls flight duration." +
                                  "No batteries required.",
                    ImagePath="carracer.png",
                    UnitPrice = 34.95,
                    CategoryID = 1
                },
                new Product
                {
                    ProductID = 6,
                    ProductName = "Ace Plane",
                    Description = "Authentic airplane toy. Features realistic color and details.",
                    ImagePath="planeace.png",
                    UnitPrice = 95.00,
                    CategoryID = 2
                },
                new Product
                {
                    ProductID = 7,
                    ProductName = "Glider",
                    Description = "This fun glider is made from real balsa wood. Some assembly required.",
                    ImagePath="planeglider.png",
                    UnitPrice = 4.95,
                    CategoryID = 2
                },
                new Product
                {
                    ProductID = 8,
                    ProductName = "Paper Plane",
                    Description = "This paper plane is like no other paper plane. Some folding required.",
                    ImagePath="planepaper.png",
                    UnitPrice = 2.95,
                    CategoryID = 2
                },
                new Product
                {
                    ProductID = 9,
                    ProductName = "Propeller Plane",
                    Description = "Rubber band powered plane features two wheels.",
                    ImagePath="planeprop.png",
                    UnitPrice = 32.95,
                    CategoryID = 2
                },
                new Product
                {
                    ProductID = 10,
                    ProductName = "Early Truck",
                    Description = "This toy truck has a real gas powered engine. Requires regular tune ups.",
                    ImagePath="truckearly.png",
                    UnitPrice = 15.00,
                    CategoryID = 3
                },
                new Product
                {
                    ProductID = 11,
                    ProductName = "Fire Truck",
                    Description = "You will have endless fun with this one quarter sized fire truck.",
                    ImagePath="truckfire.png",
                    UnitPrice = 26.00,
                    CategoryID = 3
                },
                new Product
                {
                    ProductID = 12,
                    ProductName = "Big Truck",
                    Description = "This fun toy truck can be used to tow other trucks that are not as big.",
                    ImagePath="truckbig.png",
                    UnitPrice = 29.00,
                    CategoryID = 3
                },
                new Product
                {
                    ProductID = 13,
                    ProductName = "Big Ship",
                    Description = "Is it a boat or a ship. Let this floating vehicle decide by using its " +
                                  "artifically intelligent computer brain!",
                    ImagePath="boatbig.png",
                    UnitPrice = 95.00,
                    CategoryID = 4
                },
                new Product
                {
                    ProductID = 14,
                    ProductName = "Paper Boat",
                    Description = "Floating fun for all! This toy boat can be assembled in seconds. Floats for minutes!" +
                                  "Some folding required.",
                    ImagePath="boatpaper.png",
                    UnitPrice = 4.95,
                    CategoryID = 4
                },
                new Product
                {
                    ProductID = 15,
                    ProductName = "Sail Boat",
                    Description = "Put this fun toy sail boat in the water and let it go!",
                    ImagePath="boatsail.png",
                    UnitPrice = 42.95,
                    CategoryID = 4
                },
                new Product
                {
                    ProductID = 16,
                    ProductName = "Rocket",
                    Description = "This fun rocket will travel up to a height of 200 feet.",
                    ImagePath="rocket.png",
                    UnitPrice = 122.95,
                    CategoryID = 5
                }
            };
 
            return products;
        }
    }
}

Khi cơ sở dữ liệu được tạo ra và khởi tạo, thuộc tính Seed được ghi đè và gán. Khi thuộc tính  Seed được gán, các giá trị từ danh mục và các sản phẩm được sử dụng để thao tác trong cơ sở dữ liệu. Nếu bạn thử cập nhật dữ liệu bằng cách sửa đổi mã lệnh trên sau khi cơ sở dữ liệu đã được tạo, bạn sẽ không thấy bất kỳ cập nhật khi chạy các ứng dụng Web. Lý do là các mã lệnh trên thực hiện lớp DropCreateDatabaseIfModelChanges nhận ra nếu mô hình (schema) đã thay đổi trước khi gán lại dữ liệu. Nếu không có thay đổi cho các lớp thực thể  Category  Product, cơ sở dữ liệu sẽ không được khởi tạo lại với dữ liệu gốc.

Ở thời điểm này, bạn có một thư mục Models mới với bốn lớp mới:

Cấu hình ứng dụng sử dụng mô hình dữ liệu 

Bây giờ bạn đã tạo ra các lớp  mô tả cho dữ liệu, bước tiếp theo bạn phải cấu hình ứng dụng để sử dụng các lớp. Trong file Global.asax, bạn thêm mã khởi tạo mô hình. Trong file Web.config bạn thêm thông tin để ứng dụng biết những gì cơ sở dữ liệu bạn sẽ sử dụng để lưu trữ dữ liệu được mô tả bởi các lớp dữ liệu mới.

Cập nhật file Global.asax

Để khởi tạo mô hình dữ liệu khi ứng dụng bắt đầu, thêm mã lệnh được đánh dấu đậm trong phương thức Application_Start trong file Global.asax.cs. Để xem mã lệnh tô đậm, trình duyệt của bạn phải hỗ trợ HTML5.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Optimization;
using System.Web.Routing;
using System.Web.Security;
using WingtipToys;
using System.Data.Entity;
using WingtipToys.Models;
 
namespace WingtipToys
{
    public class Global : HttpApplication
    {
        void Application_Start(object sender, EventArgs e)
        {
            // Code that runs on application startup
            BundleConfig.RegisterBundles(BundleTable.Bundles);
            AuthConfig.RegisterOpenAuth();
            Database.SetInitializer(new ProductDatabaseInitializer());
        }
 
        void Application_End(object sender, EventArgs e)
        {
            //  Code that runs on application shutdown
 
        }
 
        void Application_Error(object sender, EventArgs e)
        {
            // Code that runs when an unhandled error occurs
 
        }
    }
}

Trong mã này khi ứng dụng bắt đầu chạy, ứng dụng xác định trình khởi tạo sẽ chạy khi lần đầu tiên được truy cập.

Sửa file Web.Config

Mặc dù Entity Framework Code First sẽ tạo ra một cơ sở dữ liệu cho bạn ở một vị trí mặc định khi cơ sở dữ liệu được thao tác với dữ liệu gốc, việc thêm thông tin kết nối của bạn để ứng dụng cho phép kiểm soát các vị trí cơ sở dữ liệu. Bạn chỉ rõ kết nối cơ sở dữ liệu bằng cách sử dụng một chuỗi kết nối trong tệp Web.config  của ứng dụng tại thư mục gốc của dự án. Bằng cách thêm vào một chuỗi kết nối mới, bạn có thể chỉ rõ vị trí của cơ sở dữ liệu (wingtiptoys.mdf) có sẵn trong thư mục dữ liệu (App_Data) của ứng dụng, thay vì trí mặc định của nó.

<connectionStrings>
    <add name="DefaultConnection"
         connectionString="Data Source=(LocalDb)\v11.0;Initial Catalog=aspnet-WingtipToys-20120302100502;Integrated Security=True"
         providerName="System.Data.SqlClient" />
    <add name="WingtipToys"
         connectionString="Data Source=(LocalDB)\v11.0;AttachDbFilename=|DataDirectory|\wingtiptoys.mdf;Integrated Security=True"
         providerName="System.Data.SqlClient " />
  </connectionStrings>

Khi ứng dụng chạy lần đầu tiên, nó sẽ xây dựng cơ sở dữ liệu ở vị trí chỉ định bởi chuỗi kết nối. Tuy nhiên trước khi chạy ứng dụng, hãy biên dịch nó trước.

Biên dịch ứng dụng

Để đảm bảo tất cả các lớp và các thay đổi của ứng dụng web làm việc bạn nên biên dịch ứng dụng.
1. Từ menu the Build , chọn Build Solution. cửa sổ Output được hiển thị, và nếu tất cả đều chạy tốt bạn sẽ thấy một thông điệp succeeded 



Nếu có lỗi trong khi chạy, kiểm tra lại các bước trên. Các thông tin trong cửa sổ Output sẽ cho biết tập tin đó có một vấn đề và sự thay đổi là cần thiết trong tập tin. Thông tin này sẽ cho phép bạn xác định thành phần nào cần sửa trong các bước trên.

Tóm lược:

Trong loạt bài hướng dẫn này, bạn đã tạo ra mô hình dữ liệu, cũng như thêm vào đoạn mã sẽ được sử dụng khởi tạo cơ sở dữ liệu. Bạn cũng đã cấu hình các ứng dụng để sử dụng các mô hình dữ liệu khi ứng dụng được chạy

Trong hướng dẫn tiếp theo, bạn sẽ cập nhật giao diện người dùng (UI), thêm điều hướng, và lấy dữ liệu từ cơ sở dữ liệu. Điều này sẽ cho kết quả trong cơ sở dữ liệu được tự động tạo ra dựa trên các lớp thực thể mà bạn tạo ra trong hướng dẫn này.

Thiet ke web mien phi,  Hoc thiet ke web

ESVN-Nơi hội tụ giải pháp

Công ty Cổ phần Eastern Sun Việt Nam