Aspx.net / MVC — August 6, 2016 at 2:35 am

Học tốt MVC : Chương 4 Xây dựng Model – cấu trúc dữ liệu ứng dụng tin tức(P1)

by

Đối với MVC  những chế độ bảng là hết sức quan trọng nếu chúng ta có thể thiết kế theo mô hình 3 lớp thì tính chất của trang web của bạn sẽ trở nên chặt chẽ hơn. Ngoài ra người dùng sẽ dễ tìm kiếm những thông tin mà họ cần thiết nhất. Bài viết hôm nay chúng ta đi đến phần xây dựng model và cấu trúc dữ liệu ứng dụng tin tức trong web site của bạn nhé!

1. Phân tích hệ thống

– Các phần trước chúng ta tập trung vào quản lý mã nguồn ứng dụng và xây dựng giao diện

– Phần này chúng ta đi vào thiết kế dữ liệu và cấu trúc nội dung ứng dụng thực sự

– Với ứng dụng tin tức thông thường chúng ta có các bảng cơ bản sau :

Bảng Product: Bảng này dùng để lưu thông tin về sản phẩm

Bảng Category : Bảng này lưu thông tin về loại sản phẩm

2 bảng Product và Category có quan hệ 1 – n .Tức là 1 Category có thể có nhiều Product

Bảng User :  Bảng này lưu thông tin các User quản trị website , các user này có thể thêm , sửa , xóa nội dung website

Bảng Order : Bảng lưu các thông tin đặt hàng của khách hàng

Bảng OrderDetails :  Bảng lưu thông tin chi tiết của 1 đơn hàng

Với website không hỗ trợ đặt hàng trực tuyến .Chỉ giới thiệu sản phẩm thì không cần 2 bảng Order OrderDetails

Ngoài ra chúng ta có thể thêm các bảng chứa thông tin quảng cáo , Coment

– Để đơn giản trong quá trình học tập ứng dụng chúng tôi không thiết lập phân quyền quản lý ứng dụng

– Để tìm hiểu về phần quyền các bạn có thể đọc tài liệu về lập trình Asp.net MVC 3 , 4 của chúng tôi .Hoặc trong tài liệu xây dựng diễn đàn bằng Asp.net MVC chúng tôi cũng sử dụng phân quyền

– Chúng ta dùng mô hình dữ liệu Entity Framework code first , cơ sở dữ liệu Sql Compact 4.0 .Các bạn dễ dạng chuyển sang CSDL Sql Server

2. Xây dựng Model định nghĩa CSDL

– Các bạn có thể tạo các class tương ứng trong file .cs riêng .

– Ở đây chúng tôi tạo các lớp định nghĩa các lớp CSDL trong 1 file VinaEntity.cs

Tạo mới Class có tên là VinaEntity theo hình sau :

image-13 image14

– ta sẽ tạo 3 class nữa đó là : Product ( lưu sản phẩm), Category ( Loại sản phẩm) và User ( thành viên quản trị)

– Ta có thể tạo riêng 3 file .cs tương ứng với 3 lớp trên .Cũng có thể tạo luôn trong File VinaEntity.cs để cho gọn

Lớp Category :

public class Category

{

[Key]

public int CategoryID { get; set; }

 

[Required(ErrorMessage = “Chưa nhập tên loại sản phẩm”)]

[Display(Name = “Tên Loại Sản Phẩm”)]

public string CategoryName { get; set; }

public virtual ICollection<Product> Products { get; set; }

}

– Ta xây dựng cấu trúc bảng menu có hỗ trợ tạo menu đa cấp .Với những menu có thuộc tính pMenuID là null thì mặc định là menu cấp  1

Lớp Product

public class Product

{

[Key]

public int ProductID { get; set; }

 

[Display(Name = “Tên Sản Phẩm”)]

public string ProductName { get; set; }

 

[Display(Name = “Loại Sản Phẩm”)]

[Required(ErrorMessage = “Chưa chọn loại sản phẩm”)]

public int CategoryID { get; set; }

 

[Display(Name = “Giá”)]

public double Price { get; set; }

 

[Display(Name = “Ảnh Minh Họa”)]

public string Image { get; set; }

 

[DataType(DataType.MultilineText)]

public string ShortDescription { get; set; }

 

[Display(Name = “Mô Tả”),UIHint(“CkEditor”),Column(TypeName = “ntext”),MaxLength]

public string Description { get; set; }

 

public virtual Category Category { get; set; }

 

}

Lớp User :

 

 

public class User

{

[Key]

public

. int UserID { get; set; }

public string UserName { get; set; }

public string Password { get; set; }

 

}

Lớp Order :

 

public class Order

{

[Key]

public int OrderID { get; set; }

 

[Display(Name = “Tên Khách Hàng”), Required(ErrorMessage = “Chưa nhập tên”)]

public string Customer { get; set; }

[Display(Name = “Email Liên Hệ”), Required(ErrorMessage = “Chưa nhập Email”)]

public string Email { get; set; }

[Display(Name = “Số Điện Thoại”), Required(ErrorMessage = “Chưa nhập số điện thoại”)]

public string Phone { get; set; }

[Display(Name = “Địa chỉ liên hệ”)]

public string Address { get; set; }

[Display(Name = “Trạng thái đơn hàng”)]

public bool Active { get; set; }

public virtual ICollection<OrderDetail> OrderDetails { get; set; }

}

Lớp OrderDetails

public class OrderDetail

{

[Key]

public int ID { get; set; }

public int OrderID { get; set; }

public int ProductID { get; set; }

public int Quantity { get; set; }

public virtual Product Product { get; set; }

public virtual Order Order { get; set; }

}

– Các bạn có thể thêm các thuộc tính phù hợp với ứng dụng của mình để quản lý .Ở đây chúng tôi đưa vào các thuộc tính cơ bản để cho mã nguồn đơn giản , ngắn gọn cho các bạn dễ hiểu khi học

– Các bạn cần chú ý tới các Attribute định nghĩa CSDL ( các bạn cần tìm hiểu ý nghĩa các thuộc tính này ) .Nếu chưa biết các bạn có thể tìm hiểu trong tài liệu về lập trình MVC của chúng tôi

– Một thuộc tính đáng chú ý của lớp Product đó là thuộc tính Description chúng tôi sẽ dùng thư viện CkEditor để nhập nội dung .Chúng ta sẽ cấu hình thư viện CkEditor trong phần tiếp .

– Ngoài ra các bạn cần chú ý tới các thuộc tính tạo mối quan hệ giữa các bảng dữ liệu

Lớp VinaEntity

Lớp Entity kế thừa lớp DbContext của Entity Framework có mã như sau :

public class VinaEntity : DbContext

{

public DbSet<User> Users { get; set; }

public DbSet<Category> Categorys { get; set; }

public DbSet<Product> Products { get; set; }

public DbSet<Order> Orders { get; set; }

public DbSet<OrderDetail> OrderDetails { get; set; }

protected override void OnModelCreating(DbModelBuilder modelBuilder)

{

modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();

}

}

– Mỗi thuộc tính lớp Entity sẽ tương ứng với 1 bảng trong CSDL .Eintity Framework sẽ dựa vào lớp Entity để tạo ra CSDL tương ứng

– Chú ý ta cần khai báo các Name Space cần thiết , nếu các bạn không nhớ rõ từng nameSpace có thể để VS tự động khai báo name space bằng cách rê chuột vào phần chữ VS gạch chân màu đỏ ( báo lỗi) rồi làm như hình sau :

image15

Mã toàn bộ file VinaEntity.cs như sau :

using System.Collections.Generic;

using System.ComponentModel.DataAnnotations;

using System.ComponentModel.DataAnnotations.Schema;

using System.Data.Entity;

using System.Data.Entity.ModelConfiguration.Conventions;

 

namespace ProductMvc.Models

{

public class VinaEntity : DbContext

{

public DbSet<User> Users { get; set; }

public DbSet<Category> Categorys { get; set; }

public DbSet<Product> Products { get; set; }

public DbSet<Order> Orders { get; set; }

public DbSet<OrderDetail> OrderDetails { get; set; }

protected override void OnModelCreating(DbModelBuilder modelBuilder)

{

modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();

}

}

public class User

{

[Key]

public int UserID { get; set; }

public string UserName { get; set; }

public string Password { get; set; }

}

public class Category

{

[Key]

public int CategoryID { get; set; }

 

[Required(ErrorMessage = “Chưa nhập tên loại sản phẩm”)]

[Display(Name = “Loại Sản Phẩm”)]

public string CategoryName { get; set; }

public virtual ICollection<Product> Products { get; set; }

}

public class Product

{

[Key]

public int ProductID { get; set; }

 

[Display(Name = “Tên Sản Phẩm”)]

public string ProductName { get; set; }

 

[Display(Name = “Loại Sản Phẩm”), Required(ErrorMessage = “Chưa chọn loại sản phẩm”)]

public int CategoryID { get; set; }

 

[Display(Name = “Giá”)]

public double Price { get; set; }

 

[Display(Name = “Ảnh Minh Họa”)]

public string Image { get; set; }

 

[DataType(DataType.MultilineText)]

public string ShortDescription { get; set; }

 

[Display(Name = “Mô Tả”), UIHint(“CkEditor”), Column(TypeName = “ntext”), MaxLength]

public string Description { get; set; }

 

public virtual Category Category { get; set; }

 

}

public class Order

{

[Key]

public int OrderID { get; set; }

 

[Display(Name = “Tên Khách Hàng”), Required(ErrorMessage = “Chưa nhập tên”)]

public string Customer { get; set; }

[Display(Name = “Email Liên Hệ”), Required(ErrorMessage = “Chưa nhập Email”)]

public string Email { get; set; }

[Display(Name = “Số Điện Thoại”), Required(ErrorMessage = “Chưa nhập số điện thoại”)]

public string Phone { get; set; }

[Display(Name = “Địa chỉ liên hệ”)]

public string Address { get; set; }

[Display(Name = “Trạng thái đơn hàng”)]

public bool Active { get; set; }

public virtual ICollection<OrderDetail> OrderDetails { get; set; }

}

public class OrderDetail

{

[Key]

public int ID { get; set; }

public int OrderID { get; set; }

public int ProductID { get; set; }

public int Quantity { get; set; }

public virtual Product Product { get; set; }

public virtual Order Order { get; set; }

}

}

Leave a Comment

Your email address will not be published. Required fields are marked *