Tự Động Sinh Giá Trị Số Tăng Dần Trong Entity Framework Core Bằng Sequence

Tự Động Sinh Giá Trị Số Tăng Dần Trong Entity Framework Core Bằng Sequence

October 6, 2025 0 By Nam Vu

Trong phát triển ứng dụng .Net Core với Entity Framework Core (EF Core), có những tình huống bạn cần sinh ra một giá trị số tự động tăng mà không muốn gắn chặt nó với cột Id. Ví dụ rõ ràng nhất là các hệ thống bán hàng, nơi bạn cần tạo ra mã đơn hàng (OrderNumber), mã hóa đơn (InvoiceNumber) hoặc số phiếu (TicketCode) theo thứ tự tăng dần. Trong những trường hợp này, Sequence là lựa chọn tối ưu hơn so với Identity.

Sequence là một đối tượng trong cơ sở dữ liệu có khả năng sinh ra chuỗi giá trị số tuần tự theo quy tắc định sẵn — bắt đầu từ một giá trị cụ thể và tăng theo một bước đã định. Điểm nổi bật là Sequence hoạt động độc lập với bảng dữ liệu và không bị giới hạn bởi các ràng buộc khóa chính. Điều này mang lại tính linh hoạt cao hơn, dễ kiểm soát và sử dụng lại ở nhiều nơi trong hệ thống.

So với Identity, việc sử dụng Sequence giúp bạn kiểm soát được điểm bắt đầu, bước nhảy, có thể reset hoặc áp dụng một sequence duy nhất cho nhiều entity khác nhau. Ngoài ra, vì các giá trị được lấy trước khi insert, nó cũng cho phép ứng dụng có thể hiển thị mã (như số đơn hàng) trước khi lưu thực sự vào cơ sở dữ liệu.

Khi sử dụng EF Core, bạn có thể định nghĩa và gán Sequence cho một property bất kỳ một cách rõ ràng thông qua phương thức OnModelCreating. Dưới đây là ví dụ chi tiết cho một entity Order có thuộc tính OrderNumber được sinh tự động từ một Sequence:

// Cấu hình trong DbContext
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    // Tạo Sequence có tên "OrderNumberSequence"
    modelBuilder.HasSequence<int>("OrderNumberSequence");

    // Gán giá trị mặc định cho thuộc tính OrderNumber trong entity Order
    modelBuilder.Entity<Order>()
        .Property(o => o.OrderNumber)
        .HasDefaultValueSql("NEXT VALUE FOR OrderNumberSequence");
}

Nếu bạn muốn điều chỉnh sequence để phù hợp với nghiệp vụ (ví dụ bắt đầu từ 1000 và tăng mỗi lần 5 đơn vị), bạn có thể cấu hình thêm như sau:

modelBuilder.HasSequence<int>("OrderNumberSequence")
.StartsAt(1000)      // Bắt đầu từ 1000
.IncrementsBy(5);    // Mỗi lần tăng thêm 5

Với cấu hình này, các giá trị OrderNumber được sinh ra sẽ lần lượt là: 1000, 1005, 1010,…

Đây là cách đơn giản, hiệu quả và sạch sẽ để kiểm soát việc sinh số tự động tăng trong hệ thống của bạn mà không cần phụ thuộc vào cơ chế tự động của database engine hay logic viết tay. Nếu bạn đang xây dựng hệ thống nghiệp vụ có liên quan đến mã hóa đơn, số chứng từ hay phiếu giao dịch, hãy cân nhắc áp dụng Sequence trong EF Core để tăng tính rõ ràng và linh hoạt cho kiến trúc hệ thống.

#ntechdevelopers