Thể hiện ràng buộc khóa ngoại (Foreign Key) trong Entity Framework (EF / EF Core)

✅ Cách 1 (Khuyến nghị): Convention (Theo quy ước EF)

EF tự nhận diện Foreign Key nếu bạn đặt tên đúng quy ước.

Ví dụ: Quan hệ 1–n (User – Orders)

public class User
{
    public int Id { get; set; }
    public string Name { get; set; }

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

public class Order
{
    public int Id { get; set; }

    // Foreign Key
    public int UserId { get; set; }

    // Navigation property
    public User User { get; set; }
}

👉 EF sẽ tự hiểu:

  • UserId là khóa ngoại
  • Order.User liên kết tới User.Id

📌 Không cần cấu hình thêm


✅ Cách 2: Data Annotation [ForeignKey]

Dùng khi tên FK không theo quy ước hoặc muốn rõ ràng hơn.

using System.ComponentModel.DataAnnotations.Schema;

public class Order
{
    public int Id { get; set; }

    public int CreatedBy { get; set; }

    [ForeignKey("CreatedBy")]
    public User User { get; set; }
}

Hoặc ngược lại:

public class Order
{
    public int Id { get; set; }

    [ForeignKey(nameof(User))]
    public int UserId { get; set; }

    public User User { get; set; }
}

✅ Cách 3: Fluent API (Chuẩn & mạnh nhất)

Dùng khi:

  • Quan hệ phức tạp
  • Composite Key
  • Cấu hình cascade delete, required, optional…

Ví dụ 1–n:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Order>()
        .HasOne(o => o.User)
        .WithMany(u => u.Orders)
        .HasForeignKey(o => o.UserId)
        .OnDelete(DeleteBehavior.Cascade);
}

🔹 Quan hệ 1–1

modelBuilder.Entity<User>()
    .HasOne(u => u.Profile)
    .WithOne(p => p.User)
    .HasForeignKey<UserProfile>(p => p.UserId);

🔹 Quan hệ n–n (EF Core 5+)

modelBuilder.Entity<Student>()
    .HasMany(s => s.Courses)
    .WithMany(c => c.Students);

Hoặc có bảng trung gian:

modelBuilder.Entity<StudentCourse>()
    .HasKey(sc => new { sc.StudentId, sc.CourseId });

Hãy bình luận đầu tiên

Để lại một phản hồi

Thư điện tử của bạn sẽ không được hiện thị công khai.


*