✅ 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:
UserIdlà khóa ngoạiOrder.Userliên kết tớiUser.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 });
Để lại một phản hồi