Làm quen với ASP .NET MVC CODE FIRST

I. Khái niệm Code First trong ASP .NET MVC

Trong asp .net mvc ta có 2 cách tiếp cận chính đó là database first và code first, với 1 bài toán yêu cầu nghiệp vụ thay đổi liên tục và phát triển nhanh chóng thì code first sẽ là mô hình tiếp cập phù hợp hơn cả, sau đây mình sẽ trình bày các đặc điểm chính liên quan đến phương thức tiếp cận code first

  • Với cách tiếp cận code-first, Entity Framework sẽ tạo các đối tượng bảng cơ sở dữ liệu dựa trên model mà bạn tạo để biểu diễn dữ liệu ứng dụng.
  • Một vài quy ước của code first cho phép tự động cấu hình 1 model như sau :
    1. Quy ước tên bảng: Khi tạo 1 class mô tả các thực thể là User sẽ được lưu trữ trong database thì Entity Framework sẽ tự động tạo ra 1 bảng có tên là Users
    2. Quy ước khóa chính: Khi bạn tạo 1 thuộc tính có tên là UserId trong lớp User của model thì thuộc tính này được nhận làm khóa chính. Hơn nữa nó sẽ thiết lập 1 cột khóa auto-increment để lưu trữ giá trị nếu kiểu khóa là số nguyên.
    3. Quy ước về mối quan hệ: Entity Framework cung cấp các quy ước khác nhau để nhận biết 1 mối quan hệ giữa 2 model dựa vào tên của thuộc tính và kiểu dữ liệu Để tìm hiểu chi tiết hơn mình sẽ làm 1 ví dụ bên dưới.

II. Tạo 1 ứng dụng ASP .NET MVC với cách tiếp cận code first

Bước 1. Tạo project

Trong bài viết này mình sử dụng Visual studio 2019 và SQL Sever 2014 Tiến hành mở và tạo 1 proejct ASP .NET MVC như sau : Tiếp theo chọn MVC để có những thành phần cần thiết

Bước 2. Tạo Model

Vì là code first nên tất nhiên mình sẽ tạo các model bằng code đầu tiên rồi 😜 Chuột phải vào thư mục model => Add => Class như sau Tạo 3 Class có tên Student, Course, Enrollment, nhớ là không nên đặt tên có ký tự "s" (Số nhiều) vì quá trình generate ở database sẽ tạo ra bảng có thêm 1 ký tự "s" nữa đằng sau 😣

Cấu hình Class Student như sau:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace MyCodeFirst.Models {
    public class Student {
        public int Id { get; set; }
        public string LastName { get; set; }
        public string FirstName { get; set; }
        public DateTime EnrollmentDate { get; set; }

        public virtual ICollection<Enrollment>Enrollments { get; set; }
    }
}

Mình sẽ giải thích chi tiết một số điều ở class này

  • Bảng Student sẽ liên kết với bảng Enrollment, để định nghĩa ta dùng từ khóa virtual và 1 kiểu dữ liệu là Iconnection<Enrollment> (tham số là 1 Enrollment entity ta sẽ định nghĩa sau) => ta đã định nghĩa được 1 bảng Student được mapping sang 1 bảng Enrollment và bảng này sẽ có khóa ngoại là StudentID

Tương tự ta sẽ code 2 class Enrollment và Course như sau Enrollment.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace MyCodeFirst.Models {
    public class Enrollment {
        public int EnrollmentID { get; set; }
        public int Grade { get; set; }
        public int CourseID { get; set; }
        public int StudentID {get; set;}

        public virtual Student Student { get; set; }
        public Course Course { get; set; }
    }
}
Course.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.ComponentModel.DataAnnotations.Schema;

namespace MyCodeFirst.Models {
    public class Course {
        [DatabaseGenerated(DatabaseGeneratedOption.None)] //Sử dụng anotation để tự sinh các mã tự động trong database
        public int CourseID { get; set; }
        public string Title { get; set; }
        public int Credits { get; set; }

        public virtual ICollection<Enrollment>Enrollments { get; set; }
    }
}

Bước 3. Connect database

  • Mở Sql Sever và tiến hành tạo 1 database có tên MyCodeFirst

  • Chọn property của sever để lấy sever name

  • Vào Project => Manager nuget package => Chọn tab browse và tìm entity framework như hình

  • Vào Sever Explorer => Chọn Connect to database => Nhập tên sever và chọn database vừa tạo

  • Tiếp theo ta click chuột phải vào data connection vừa kết nối => Property => Coppy connection string

  • Mở file webconfig.cs thêm đoạn tương tự (connection string của bạn sẽ khác) sau vào trong thẻ configuration

<connectionStrings>
    <add name="MyCodeFirstContext" connectionString="Data Source=DESKTOP-E2I8M9U\SQLEXPRESS;Initial Catalog=MyCodeFirst;Integrated Security=True" providerName="System.Data.SqlClient"/>
  </connectionStrings>

B4. Tạo Data accept layer chứa các context

  • Vào project tạo thêm 1 thư mục có tên DAL => Tạo 1 class có tên MyCodeFirstContext.cs và cấu hình như sau
using MyCodeFirst.Models;
using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.Linq;
using System.Web;

namespace MyCodeFirst.DAL {
    public class MyCodeFirstContext : DbContext{
        public MyCodeFirstContext() : base("MyCodeFirstContext") {

        }

        public DbSet<Student> Students { get; set; }
        public DbSet<Enrollment> Enrollments { get; set; }
        public DbSet<Course> Courses { get; set; }
    }
}

Xong xuôi hãy tiến hành rebuild project, đây là bắt buộc

B5. Tạo controller và view

  • Chuột phải thư mục controller => add => Add new scaffolded Item => MVC 5 Controller with view, using entity framewrok

Ở đây chúng ta sẽ generate cả controller và view của Student model, với Course và Enrollment các bạn làm tương tự nhé

  • Run app và được kết quả
  • Trong database đã có các bảng

Các bước thực hiện khi thay đổi Model trong Code First

  • Đôi khi vì nghiệp vụ ta cần phải thay đổi các bảng trong database, với code first ta phải thực hiện như sau, ở đây mình sẽ thay đổi class model Student như sau
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace MyCodeFirst.Models {
    public class Student {
        public int Id { get; set; }
        public string LastName { get; set; }
        public string FirstName { get; set; }
        public string Address { get; set; } //Mình thêm trường address
        public DateTime EnrollmentDate { get; set; }

        public virtual ICollection<Enrollment>Enrollments { get; set; }
    }
}
  • Ta vào tool => Nuget package manager => Package manager console Thực hiện 3 câu lần lượt :
enable-migrations
Add-Migration AddAddressToStudent
Update-Database

Kết qua ta đã có thêm cột address trong bảng student

  • Do bảng student đã thay đổi nên bạn cùng cần xóa StudentController và các View tương ứng và tạo lại như bước 5 để tránh lỗi nhé

Tổng kết

+Ưu điểm: Rất phổ biến (vì các lập trình viên thường không thích thiết kế DB, nhưng thích thiết kế class) Kiểm soát hoàn toàn code model, thêm xóa sửa thuộc tính vô cùng dễ dàng Không phải nặng đầu suy nghĩ về DB. Đối với cách tiếp cận này, DB chỉ là cái “cục” data, lôi ra xài thôi Có thể version control Database.

+Nhược điểm: Các thay đổi cấu trúc trực tiếp trên DB sẽ mất Khó kiểm soát những column sẽ tạo trên Db Hơi khó khi kết hợp với Db có sẵn.

Theo mình code-first sẽ giúp chúng ta nắm và hiểu được cơ bản về quá trình generate dữ liệu, sẽ giúp cho người mới học có thể dễ dàng tiếp cận. Đặc biệt nó giúp cho ta chủ động hơn trong việc thêm sửa hay xóa model.

  • Bài viết được tham khảo từ blog của anh haitqd, đây là bài viết tiếp theo về series asp .net mvc của mình, mọi người cho mình nhận xết để thay đổi tốt hơn cũng như động lực để mình làm các bài viết tiếp theo nhé 👍😇