آموزش جامع Fluent API در Code First
در دنیای برنامهنویسی با Entity Framework، طراحی دیتابیس به روش Code First محبوبیت زیادی دارد. یکی از ابزارهای قدرتمند در این مسیر، Fluent API در Code First است. این ابزار به شما اجازه میدهد تا فراتر از محدودیتهای Data Annotations حرکت کنید. با استفاده از این قابلیت، کنترل کاملی روی روابط، کلیدها و ساختار جداول خواهید داشت. در این مقاله، تمام جزئیات پیکربندی Fluent API را با هم بررسی میکنیم.
چرا باید از Fluent API استفاده کنیم؟ 🛠️
در روش Code First، شما میتوانید از ویژگیها (Attributes) روی کلاسها استفاده کنید. اما Fluent API قدرت بسیار بیشتری دارد. این روش باعث میشود کلاسهای مدل شما تمیز بمانند. در واقع، منطق دیتابیس از منطق تجاری برنامه جدا میشود. این موضوع باعث افزایش خوانایی و نگهداری آسانتر کد میشود.
مزایای اصلی استفاده از Fluent API
- 💎 جداسازی کامل تنظیمات دیتابیس از کلاسهای Domain.
- 🚀 امکان تعریف روابط بسیار پیچیده که با ویژگیها ممکن نیست.
- 🧹 تمیز ماندن کدها و رعایت اصول Clean Code.
- ⚙️ کنترل دقیق بر روی نام جداول، ستونها و انواع دادهها.
- ✅ اولویت بالاتر نسبت به Data Annotations در اجرا.
کاربردهای رایج در پروژههای واقعی
- 🎯 تعریف کلیدهای ترکیبی (Composite Keys).
- 🔗 مدیریت دقیق روابط چندبهچند (Many-to-Many).
- 🛡️ تنظیم رفتارهای حذف آبشاری (Cascade Delete).
- 🏷️ تغییر نام کلیدهای خارجی بدون تغییر در کلاسهای مدل.
آموزش ثبتنام در سیستم آموزشی 📝
اگر قصد دارید پروژههای خود را به صورت حرفهای مدیریت کنید، همین حالا اقدام کنید. برای دسترسی به پنل کاربری و منابع اختصاصی، مراحل زیر را دنبال نمایید:
۱. 🌐 ابتدا وارد وبسایت p.api.ir شوید.
۲. 👤 بر روی گزینه ثبتنام کلیک کنید.
۳. 📧 اطلاعات خود را به دقت وارد نمایید.
۴. ✅ پس از تایید هویت، به تمامی امکانات دسترسی خواهید داشت.
مدیریت روابط در Fluent API (Relationship Mapping)
یکی از مهمترین بخشهای Fluent API، تعریف روابط بین جداول است. در ادامه انواع این روابط را بررسی میکنیم.
۱. روابط یکبهیک (One-to-Zero-or-One) 🤝
گاهی نیاز داریم یک رابطه یکبهیک ایجاد کنیم که در آن یک سمت اختیاری باشد. کد زیر را در نظر بگیرید:
modelBuilder.Entity<OfficeAssignment>()
.HasKey(t => t.InstructorID);
modelBuilder.Entity<OfficeAssignment>()
.HasRequired(t => t.Instructor)
.WithOptional(t => t.OfficeAssignment);
در این مثال، هر OfficeAssignment حتماً به یک مدرس نیاز دارد. اما مدرس میتواند دفتر کاری نداشته باشد (اختیاری).
۲. روابط یکبهیک اجباری در هر دو سمت
اگر بخواهید هر دو سمت رابطه اجباری باشد، از کد زیر استفاده کنید:
modelBuilder.Entity<Instructor>()
.HasRequired(t => t.OfficeAssignment)
.WithRequiredPrincipal(t => t.Instructor);
۳. روابط چندبهچند (Many-to-Many) 🔗
در روابط چندبهچند، EF به طور خودکار جدول واسط را میسازد. اما برای کنترل بیشتر بر نام جداول و ستونها، Fluent API بهترین گزینه است:
modelBuilder.Entity<Course>()
.HasMany(t => t.Instructors)
.WithMany(t => t.Courses)
.Map(m =>
{
m.ToTable("CourseInstructor");
m.MapLeftKey("CourseID");
m.MapRightKey("InstructorID");
});
با این کد، نام جدول واسط و نام ستونهای آن دقیقاً مطابق میل شما تنظیم میشود.
تنظیمات حذف آبشاری (Cascade Delete) 🗑️
در Entity Framework، حذف آبشاری به صورت پیشفرض فعال است. اگر کلید خارجی شما Nullable نباشد، با حذف رکورد اصلی، رکوردهای وابسته نیز حذف میشوند.
برای غیرفعال کردن این ویژگی در تمام دیتابیس، میتوانید از متد زیر استفاده کنید:
modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>();
modelBuilder.Conventions.Remove<ManyToManyCascadeDeleteConvention>();
همچنین برای فعالسازی دستی در یک رابطه خاص:
modelBuilder.Entity<Course>()
.HasRequired(t => t.Department)
.WithMany(t => t.Courses)
.HasForeignKey(d => d.DepartmentID)
.WillCascadeOnDelete(true);
مدیریت کلیدهای خارجی و ترکیبی 🔑
گاهی در طراحی دیتابیس نیاز به کلیدهای غیرمعمول داریم. Fluent API در اینجا نیز به کمک ما میآید.
کلیدهای اصلی ترکیبی (Composite Keys)
اگر جدول شما بیش از یک ستون برای کلید اصلی دارد:
modelBuilder.Entity<Department>()
.HasKey(d => new { d.DepartmentID, d.Name });
تغییر نام کلید خارجی
اگر نام فیلد در کلاس با نام ستون در دیتابیس متفاوت است:
modelBuilder.Entity<Course>()
.HasRequired(c => c.Department)
.WithMany(t => t.Courses)
.Map(m => m.MapKey("ChangedDepartmentID"));نمونه مدل کامل (Model Example) 👨💻
در اینجا یک ساختار کامل کلاسها برای درک بهتر موضوع ارائه شده است. این کد نشان میدهد چگونه کلاسها بدون وابستگی به دیتابیس طراحی میشوند.
public class SchoolEntities : DbContext
{
public DbSet<Course> Courses { get; set; }
public DbSet<Department> Departments { get; set; }
public DbSet<Instructor> Instructors { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
// حذف قرارداد جمع بستن نام جداول
modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
}
}
public class Instructor
{
public int InstructorID { get; set; }
public string LastName { get; set; }
public string FirstName { get; set; }
public virtual ICollection<Course> Courses { get; set; }
}
public class Course
{
public int CourseID { get; set; }
public string Title { get; set; }
public int DepartmentID { get; set; }
public virtual Department Department { get; set; }
public virtual ICollection<Instructor> Instructors { get; set; }
}جمعبندی 🏁
استفاده از Fluent API در Code First بهترین راه برای مدیریت حرفهای دیتابیس است. این ابزار به شما قدرت میدهد تا سختگیرانهترین سناریوهای دیتابیس را پیادهسازی کنید. با جدا کردن تنظیمات از مدلها، کد شما خواناتر و توسعه پذیرتر خواهد شد. پیشنهاد میشود در پروژههای بزرگ حتماً از این روش به جای Data Annotations استفاده کنید.
سوالات خود را در بخش نظرات بپرسید! 💬
آیا شما تجربه استفاده از Fluent API را داشتهاید؟ کدام ویژگی آن برای شما کاربردیتر بوده است؟ نظرات خود را با ما به اشتراک بگذارید.
