روابط یک به چند در EF Core چیست ؟ رابطه یک به چند (One-to-Many) به این معناست که یک موجودیت (Entity) میتواند چندین موجودیت دیگر را داشته باشد، اما هر یک از آن موجودیتها فقط به یک موجودیت از نوع اول مرتبط هستند. در این آموزش ، یک رابطه یک به چند (One-to-Many) بین دانشجو (Student) و شمارههای تماس (Phone) تعریف میکنیم. به این معنی که هر دانشجو میتواند چندین شماره تماس داشته باشد، اما هر شماره تماس فقط به یک دانشجو مرتبط است.
ارتباط یک به چند زمانی استفاده میشود که یک موجودیت اصلی میتواند چندین زیرمجموعه یا داده وابسته داشته باشد، اما هر یک از این دادههای وابسته فقط به یک موجودیت اصلی مرتبط باشند. هر زمان که یک موجودیت باید چندین مقدار مرتبط داشته باشد، اما هر مقدار فقط به یک موجودیت خاص مرتبط است، از رابطه یک به چند (One-to-Many) استفاده میکنیم.
ابتدا کلاسهای Student و Phone را تعریف میکنیم. که نمایانگر جداول دیتابیس هستند.
public class Student
{
public int Id { get; set; }
public required string Name { get; set; }
public required string Family { get; set; }
public required string Email { get; set; }
//Navigation Property
public ICollection<Phone>? Phones { get; set; }
}
public class Phone
{
public int Id { get; set; }
public required string PhoneNumber { get; set; }
public required PhoneType PhoneType { get; set; }
//Navigation Property
public int StudentId { get; set; }
public required Student Student { get; set; }
}
public enum PhoneType
{
[Display(Name = "خانه")]
Home,
[Display(Name = "کار")]
Work,
[Display(Name = "تلفن همراه")]
Mobile
}
public class StudentViewModel
{
public int Id { get; set; }
public required string Name { get; set; }
public required string Family { get; set; }
public required string Email { get; set; }
public ICollection<Phone>? Phones { get; set; }
}
public class PhoneViewModel
{
public int Id { get; set; }
public required string PhoneNumber { get; set; }
public string? FullName { get; set; }
public required PhoneType PhoneType { get; set; }
public int StudentId { get; set; }
}
public DbSet<Student> students { get; set; }
public DbSet<Phone> Phones { get; set; }
modelBuilder.Entity<Student>()
.HasMany(s => s.Phones)
.WithOne(p => p.Student)
.HasForeignKey(p => p.StudentId)
.OnDelete(DeleteBehavior.Cascade);