Các quy ước trong Entity Framework Core

Các quy ước là một tập hợp các quy tắc được tích hợp sẵn trong Entity Framework Core chi phối cách mô hình sẽ được ánh xạ tới một lược đồ cơ sở dữ liệu.

Hầu hết thời gian, đặc biệt là với việc phát triển ứng dụng mới, cần tuân theo các quy ước của Entity Framework Core khi phát triển mô hình.

Trong trường hợp không thể thực hiện được, bạn có thể sử dụng các tùy chọn cấu hình của Entity Framework Core.

Khóa chính (Primary Key)

Nếu một thuộc tính được đặt tên ID hoặc <entity name>ID (không phân biệt chữ hoa chữ thường), thì nó sẽ được cấu hình làm khóa chính.

Entity Framework Core sẽ chọn ID thay vì<entity name>ID trong trường hợp một lớp chứa cả hai.

Các ví dụ sau minh họa hai phiên bản của thực thể Book trong đó thuộc tính int tuân theo quy ước:

public class Book
{
    public int Id { get; set; }
    public string Title { get; set; }
}
public class Book
{
    public int BookId { get; set; }
    public string Title { get; set; }
}

Entity Framework Core sẽ chỉ định rằng các giá trị cột khóa chính được cơ sở dữ liệu tạo tự động.

Khóa ngoại (Foreign Key)

Quy ước cho khóa ngoại là nó phải có cùng kiểu dữ liệu với thuộc tính khóa chính của thực thể chính và tên phải tuân theo một trong các mẫu sau:

  • <navigation property name><principal primary key property name>Id
  • <principal class name><primary key property name>Id
  • <principal primary key property name>Id

Trong mô hình ví dụ dưới đây, không có thuộc tính khóa ngoại nào được định nghĩa trong thực thể phụ thuộc Book.

public class Author
{
    public int AuthorId { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public ICollection<Book> Books { get; set; }
}

public class Book
{
    public int BookId { get; set; }
    public string Title { get; set; }
    public Author Writer { get; set; }
    public string Isbn { get; set; }
}

Theo thứ tự ưu tiên, các tên thuộc tính sau được chấp nhận:

  • WriterAuthorId
  • AuthorAuthorId
  • AuthorId

Tương tự như khóa chính, tên thuộc tính khóa ngoại không phân biệt chữ hoa chữ thường. Entity Framework Core sẽ suy ra số nhiều của một mối quan hệ từ khả năng cho phép null của khóa ngoại. Nếu thuộc tính không cho phép null, mối quan hệ được thiết lập là bắt buộc; nếu không thì nó được thiết lập là tùy chọn.

Thuộc tính khóa ngoại shadow (Foreign Key Shadow Properties)

Nếu bạn chọn không đưa thuộc tính khóa ngoại một cách rõ ràng vào đầu cuối phụ thuộc của mối quan hệ, Entity Framework Core sẽ tạo thuộc tính shadow bằng cách sử dụng mẫu <principal primary key property name>Id.

Trường sao lưu (Backing Fields)

Các trường sao lưu được sử dụng để đảm bảo tính đóng gói (encapsulation). Entity Framework Core sẽ ghi và đọc từ chúng nếu có thể. Entity Framework Core sẽ tự động ánh xạ một trường sao lưu nếu tên của nó phù hợp với các mẫu sau:

  • _<camel-cased property name>
  • _<property name>
  • m_<camel-cased property name>
  • m_<property name>

Thuộc tính Publisher trong ví dụ sau có một trường ủng hộ có sử dụng mẫu đầu tiên. Thuộc tính RecommendedRetailPrice có một trường sao lưu phù hợp với mẫu thứ ba:

public class Book
{
    private Publisher _publisher;
    private decimal m_recommendedRetailPrice;
    
    public int BookId { get; set; }
    public string Title { get; set; }
    public int PublisherId { get; set; }
    public Publisher Publisher 
    { 
        get { return _publisher; }
        set { _publisher = value; }
    }
    public decimal RecommendedRetailPrice 
    {
        get { return m_recommendedRetailPrice; }
        set { m_recommendedRetailPrice = value; }
    }
}

Bảng (Table)

Entity Framework Core sẽ ánh xạ một thực thể vào một bảng có cùng tên với thuộc tính DbSet<TEntity> tương ứng của nó.

Entity Framework Core cũng sẽ ánh xạ các thực thể không có thuộc tính DbSet<TEntity> tương ứng nếu thực thể đó tham gia vào mối quan hệ được xác định đầy đủ với các thực thể có thuộc tính DbSet<TEntity> tương ứng. Entity Framework Core sẽ ánh xạ một thực thể như vậy vào một bảng được đặt tên theo tên lớp.

Trong ví dụ sau, Entity Framework Core sẽ ánh xạ thực thể Book (có thuộc tính DbSet trong lớp DbContext) với một bảng có tên Books và thực thể Publisher (không có thuộc tính DbSet, nhưng tham gia vào mối quan hệ được xác định đầy đủ với Book) vào một bảng có tên Publisher:

public class LibraryContext : DbContext
{
    public DbSet<Book> Books { get; set; }
}

public class Book
{
    public int BookId { get; set; }
    public string Title { get; set; }
    public int PublisherId { get; set; }
    public Publisher Publisher { get; set; }
}

public class Publisher
{
    public int PublisherId { get; set; }
    public string Name { get; set; }
    public ICollection<Book> Books { get; set; }
}

Lược đồ (Schema)

Entity Framework Core sẽ ánh xạ các đối tượng vào lược đồ dbo theo mặc định.

Cột (Column)

Entity Framework Core sẽ ánh xạ các thuộc tính của thực thể thành các cột có cùng tên trong cơ sở dữ liệu.

Kiểu dữ liệu (Data Types)

Thuộc tính kiểu chuỗi có kích thước không giới hạn và được ánh xạ tới kiểu dữ liệu nullable thích hợp do nhà cung cấp cơ sở dữ liệu xác định (ví dụ: nvarchar(MAX) trong SQL Server).

Tất cả các kiểu dữ liệu khác do nhà cung cấp cơ sở dữ liệu quyết định.

Cách dễ nhất để thiết lập cách các kiểu dữ liệu của .NET được ánh xạ tới một kiểu dữ liệu của cơ sở dữ liệu cụ thể là tạo một mô hình với các thuộc tính bao gồm tất cả các kiểu và sau đó tạo một chuyển đổi (migration) cho mô hình đó.

Ngược lại, bạn có thể tạo một bảng trong cơ sở dữ liệu đích bao gồm tất cả các kiểu dữ liệu của cơ sở dữ liệu, sau đó thiết kế ngược các bảng đó thành một mô hình.

Chỉ mục (Index)

Entity Framework Core sẽ luôn tạo chỉ mục cho khóa ngoại và khóa thay thế.

Những điều cần nhớ về các quy ước trong Entity Framework Core

  1. Thuộc tính được đặt tên ID hoặc <entity name>ID (không phân biệt chữ hoa chữ thường) sẽ được cấu hình làm khóa chính (primary key).
  2. Thuộc tính của thực thể phụ thuộc có cùng kiểu dữ liệu với khóa chính và có tên đặt đúng quy tắc với thực thể chính sẽ được cấu hình làm khóa ngoại (foreign key).
  3. Trường sao lưu được sử dụng để đảm bảo tính đóng gói (encapsulation). Entity Framework Core sẽ ghi và đọc từ chúng nếu có thể.
  4. Entity Framework Core sẽ ánh xạ một thực thể vào một bảng có cùng tên với thuộc tính DbSet<TEntity> tương ứng của nó.
  5. Entity Framework Core sẽ ánh xạ các đối tượng vào lược đồ dbo theo mặc định.
  6. Entity Framework Core sẽ ánh xạ các thuộc tính của thực thể thành các cột có cùng tên trong cơ sở dữ liệu.
  7. Entity Framework Core sẽ luôn tạo chỉ mục cho khóa ngoại và khóa thay thế.
Entity Framework Core
Bài Viết Liên Quan:
ConnectionString cho Entity Framework Core từ A-Z
Trung Nguyen 15/10/2021
ConnectionString cho Entity Framework Core từ A-Z

Trong bài viết này, chúng tôi sẽ hướng dẫn bạn cách thiết lập các chuỗi kết nối cho SQL Server, Azure SQL, SQLite, PostgreSQL, MySQL và MariaDB.

Cấu hình trong Entity Framework Core
Trung Nguyen 03/04/2021
Cấu hình trong Entity Framework Core

Trong hướng dẫn này, bạn sẽ tìm hiểu cách cấu hình sử dụng attribute, Fluent API để ghi đè các quy ước mặc đình trong Entity Framework Core.

Quản lý mối quan hệ Một - Nhiều trong Entity Framework Core
Trung Nguyen 03/04/2021
Quản lý mối quan hệ Một - Nhiều trong Entity Framework Core

Trong hướng dẫn này, bạn sẽ tìm hiểu cách tạo, sửa đổi và xóa mối quan hệ một - nhiều trong Entity Framework Core.

Giới thiệu về các mối quan hệ trong Entity Framework Core
Trung Nguyen 03/04/2021
Giới thiệu về các mối quan hệ trong Entity Framework Core

Trong hướng dẫn này, bạn sẽ tìm hiều về các mối quan hệ một - nhiều, nhiều - nhiều và một - một trong Entity Framework Core.