
پیادهسازی روابط چند به چند در EF Core
در آموزش پیادهسازی روابط چند به چند در EF Core، ابتدا مفهوم روابط چند به چند در پایگاه داده بررسی میشود. سپس نحوه پیادهسازی آن در EF Core با استفاده از جدول واسط (Join Table) و کلیدهای ترکیبی را یاد میگیریم. رابطه چند به چند یکی از انواع ارتباطات در مدلسازی دادههاست که زمانی اتفاق میافتد که دو موجودیت به گونهای به هم مرتبط شوند که هر نمونه از موجودیت اول میتواند با چندین نمونه از موجودیت دوم ارتباط داشته باشد و بالعکس.
به عنوان مثال، در یک سیستم مدیریت آموزشی، یک دانشجو میتواند در چندین دوره ثبتنام کند و هر دوره نیز میتواند شامل چندین دانشجو باشد. این نوع رابطه معمولاً با استفاده از یک جدول واسط (Join Table) پیادهسازی میشود که نقش پل بین دو جدول اصلی را ایفا میکند و شامل کلیدهای خارجی مرتبط با هر دو جدول است. این جدول واسط امکان مدیریت ارتباطات پیچیده را فراهم میکند و به صورت خودکار یا دستی در پایگاه داده طراحی میشود.
رابطه چند به چند (Many-to-Many) نوعی ارتباط بین دو موجودیت است که در آن هر نمونه از یک موجودیت میتواند با چندین نمونه از موجودیت دیگر مرتبط باشد و برعکس. برای پیادهسازی این رابطه، معمولاً از یک جدول واسط استفاده میشود.
در چه زمانی از روابط چند به چند در EF Core استفاده کنیم؟
ارتباط چند به چند (Many-to-Many) زمانی استفاده میشود که بین دو موجودیت (Entity) رابطهای وجود داشته باشد که هر نمونه از یک موجودیت میتواند با چندین نمونه از موجودیت دیگر مرتبط باشد و برعکس.
- دانشجویان و دورهها : یک دانشجو میتواند در چندین دوره ثبتنام کند و هر دوره نیز میتواند شامل چندین دانشجو باشد.
- محصولات و سبد خرید : یک محصول میتواند در چندین سبد خرید قرار گیرد و هر سبد خرید نیز میتواند شامل چندین محصول باشد.
تعریف مدل ها
مدل Student
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; }
public ICollection<StudentCourse>? StudentCourses { get; set; }
}Course
public class Course
{
public int Id { get; set; }
public required string Name { get; set; }
public required int Credits { get; set; }
public ICollection<StudentCourse> StudentCourses { get; set; }= [];
}مدل StudentCourse – جدول واسط (Join Table)
public class StudentCourse
{
public int StudentId { get; set; }
public int CourseId { get; set; }
public required Student Student { get; set; }
public required Course Course { get; set; }
}تعریف ویو مدل ها
ویو مدل Student
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; }
}ویو مدل Course
public class CourseViewModel
{
public int Id { get; set; }
public required string Name { get; set; }
public required int Credits { get; set; }
}تنظیمات DbContext
public DbSet<Student> students { get; set; }
public DbSet<Course> courses { get; set; }
public DbSet<StudentCourse> StudentCourses { get; set; }
//--------------------------------------
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
//--------------------------------------
modelBuilder.Entity<StudentCourse>()
.HasKey(sc => new { sc.StudentId, sc.CourseId });
//--------------------------------------
modelBuilder.Entity<StudentCourse>()
.HasOne(s => s.Student)
.WithMany(s => s.StudentCourses)
.HasForeignKey(s => s.StudentId)
.OnDelete(DeleteBehavior.Cascade);
//--------------------------------------
modelBuilder.Entity<StudentCourse>()
.HasOne(s => s.Course)
.WithMany(s => s.StudentCourses)
.HasForeignKey(s => s.CourseId)
.OnDelete(DeleteBehavior.Cascade);
}- متد HasKey : یک متد در Fluent API است که برای تعیین کلید اصلی (Primary Key) یک موجودیت یا جدول استفاده میشود.
- متد HasOne : یک متد است که برای تعریف یک رابطه یک به یک (One-to-One) یا یک طرف یک رابطه یک به چند (One-to-Many) استفاده میشود.
- متد WithMany : یک متد است که برای تعریف طرف “چند” (Many) در یک رابطه یک به چند (One-to-Many) یا چند به چند (Many-to-Many) استفاده میشود.
- متد HasForeignKey : یک متد است که برای تعریف کلید خارجی (Foreign Key) در یک رابطه استفاده میشود.
- متد OnDelete : یک متد است که برای تعیین رفتار حذف (Delete Behavior) در یک رابطه استفاده میشود.
تنظیمات AutoMapper
CreateMap<Student,StudentViewModel>().ReverseMap();
CreateMap<Course, CourseViewModel>().ReverseMap();
































فرم افزودن دیدگاه
با ارسال نظرات خود ما را در ایجاد محتوای بهتر کمک کنید.