EF Code-First - Tạo ứng dụng Code-First đầu tiên

Tạo ứng dụng EF Core đầu tiên

Trong phần trước, chúng ta đã cài đặt entity framework trong dự án của mình. Ở đây, chúng ta sẽ tạo một ví dụ đầu tiên.

Giả sử rằng chúng ta muốn tạo một ứng dụng đơn giản quản lý học sinh. Người dùng sử dụng ứng dụng này có thể thêm và cập nhật thông tin học sinh, điểm, giáo viên và khóa học.

Thay vì thiết kế các bảng cơ sở dữ liệu trước tiên, chúng ta bắt đầu tạo các lớp . Trước tiên, hãy tạo các lớp Student và Grade trong đó mỗi Student được liên kết với một Grade như được hiển thị bên dưới. Đây được gọi là mối quan hệ một-nhiều. Chúng ta tìm hiểu về cách EF quản lý mối quan hệ giữa các thực thể (lớp miền) tại đây.

public class Student
{
    public int StudentID { get; set; }
    public string StudentName { get; set; }
    public DateTime? DateOfBirth { get; set; }
    public byte[]  Photo { get; set; }
    public decimal Height { get; set; }
    public float Weight { get; set; }
        
    public Grade Grade { get; set; }
}

Tạo lớp Grade như hình sau.

public class Grade
{
    public int GradeId { get; set; }
    public string GradeName { get; set; }
    public string Section { get; set; }
    
    public ICollection<Student> Students { get; set; }
}

Bây giờ, chúng ta đã hoàn tất với các lớp miền ban đầu cho ứng dụng quản lý học sinh.

Cách tiếp cận Code-First cũng yêu cầu một lớp context  phải được kế thừa lớp DbContext. Tạo một lớp context như hình dưới đây. Lớp context được kế thừa từ lớp DBContext và hiển thị các thuộc tính DbSet có kiểu dữ liệu mà bạn muốn trở thành một phần của Model, ví dụ: Lớp Student và lớp Grade. DbSet là một tập hợp các lớp thực thể (hay còn gọi là tập thực thể), vì vậy chúng tôi đã đặt tên các thuộc tính dưới dạng số nhiều của tên thực thể như Student và lớp Grade.

namespace EF6Console
{
    public class SchoolContext: DbContext 
    {
        public SchoolContext(): base()
        {
            
        }
            
        public DbSet<Student> Students { get; set; }
        public DbSet<Grade> Grades { get; set; }
    }
}

Chúng ta đã hoàn thành với các lớp bắt buộc cho phương pháp code-first . Bây giờ chúng ta sẽ thêm một sinh viên bằng cách sử dụng lớp context như hình dưới đây.

// @nuget: EntityFramework

using System;
using System.Linq;
using System.Data.Entity;
using System.Collections;
using System.Collections.Generic;

public class Program
{
	public static void Main()
	{
		using (var ctx = new SchoolContext())
        {
			var stud = new Student() { StudentName = "Bill" };

			ctx.Students.Add(stud);
			ctx.SaveChanges(); 
	
			Console.Write("Student saved successfully!");
			
			// The following displays Student table data - dotnetfiddle.net specific code
			FiddleHelper.WriteTable("Student", ctx.Students.ToList());
		}
	}
}

public class SchoolContext: DbContext 
{
	public SchoolContext() : base(FiddleHelper.GetConnectionStringSqlServer()) // passed dotnetfiddle specific connction string
	{
	}
            
	public DbSet<Student> Students { get; set; }
    public DbSet<Grade> Grades { get; set; }
}

public class Student
{
    public int StudentID { get; set; }
    public string StudentName { get; set; }
    public DateTime? DateOfBirth { get; set; }
    public byte[]  Photo { get; set; }
    public decimal Height { get; set; }
    public float Weight { get; set; }
        
    public Grade Grade { get; set; }
}

public class Grade
{
    public int GradeId { get; set; }
    public string GradeName { get; set; }
    public string Section { get; set; }
    
    public ICollection<Student> Students { get; set; }
}

Nếu chạy ứng dụng, chúng ta sẽ thấy một học sinh được thêm vào cơ sở dữ liệu thành công.


Nhưng cơ sở dữ liệu ở đâu và đâu là các bảng và cột của chúng?

Đây là vẻ đẹp của EF Code-First API. Nó tạo cơ sở dữ liệu dựa trên tham số được truyền vào phương thức thiết lập của lớp context.

Vì chúng ta chưa chuyển bất kỳ tham số nào trong phương thức khởi tạo của lớp context, nó đã tạo cơ sở dữ liệu EF6Console.SchoolContext trong hệ quản trị cơ sở dữ liệu SQLEXPRESS, như hình bên dưới. Nó cũng tạo hai bảng trong cơ sở dữ liệu này, Student và Grade dựa trên các lớp miền Stduent Grade được định nghĩa ở trên.

Entity Framework code-first example

Như bạn có thể thấy trong hình trên, nó đã tạo các bảng Student Grade và mỗi bảng chứa các cột có kiểu dữ liệu và độ dài thích hợp. Tên cột và kiểu dữ liệu khớp với thuộc tính của các lớp miền tương ứng. Cũng đã tạo StudentId và GradeId làm PK (khóa chính) và tạo cột Grade_GradeId làm FK (khóa ngoại).

Bằng cách này, chúng tA không cần tạo cơ sở dữ liệu trước, bạn có thể bắt đầu viết một ứng dụng mà cuối cùng sẽ tạo cơ sở dữ liệu từ các lớp miền của bạn.

Lưu ý: Nếu bạn sửa đổi các lớp này và chạy lại ứng dụng, thì nó sẽ ném ra ngoại lệ sau.

Entity Framework code-first example

Chúng ta cần định nghĩa khởi tạo cơ sở dữ liệu trong lớp context để sửa đổi các lớp miền và chạy ứng dụng cục bộ.

Chắc hẳn bạn đang tự hỏi làm thế nào nó tạo ra các cột với kiểu dữ liệu và độ dài thích hợp với PK & FK, phải không? Câu trả lời là sử dụng quy ước đầu tiên mã.