Fluent API یکی از روشهای پیکربندی مدلها در Entity Framework Core است که به صورت کدنویسی زنجیرهای (Fluent Style) در متد OnModelCreating در کلاس DbContext انجام میشود. این روش در کنار Data Annotations استفاده میشود، اما نسبت به آن انعطافپذیرتر و قدرتمندتر است، مخصوصاً برای پیکربندیهای پیچیده مانند روابط چندگانه، Mapping کلید مرکب، تغییر نام جدول/ستون، و غیره. با ما همراه باشید با آموزش پیشرفته Fluent Api در EF Core و Asp.Net Core.
| قابلیت | کد Fluent API |
|---|---|
| تعریف کلید اصلی | builder.HasKey(x => x.Id); |
| کلید مرکب | builder.HasKey(x => new { x.A, x.B }); |
| تغییر نام جدول | builder.ToTable("table_name"); |
| تعیین اسکیمای جدول | builder.ToTable("table_name", "schema"); |
| تغییر نام ستون | builder.Property(x => x.Email).HasColumnName("user_email"); |
| تعیین نوع ستون در SQL | builder.Property(x => x.Name).HasColumnType("nvarchar(100)"); |
| فیلد اجباری | builder.Property(x => x.Name).IsRequired(); |
| طول حداکثری رشته | builder.Property(x => x.Name).HasMaxLength(100); |
| مقدار پیشفرض | builder.Property(x => x.IsActive).HasDefaultValue(true); |
| مقدار پیشفرض با SQL | builder.Property(x => x.CreatedAt).HasDefaultValueSql("GETDATE()"); |
| نادیده گرفتن ستون | builder.Ignore(x => x.Temp); |
| ستون Auto-Increment | builder.Property(x => x.Id).UseIdentityColumn(); |
| مقدار غیر خودکار | builder.Property(x => x.Id).ValueGeneratedNever(); |
| ستون GUID | builder.Property(x => x.Id).HasDefaultValueSql("NEWID()"); |
| ستون RowVersion | builder.Property(x => x.RowVersion).IsRowVersion(); |
| ایندکس | builder.HasIndex(x => x.Email); |
| ایندکس یکتا | builder.HasIndex(x => x.Email).IsUnique(); |
| رابطه One-to-Many | |
| رابطه One-to-One | |
| رابطه Many-to-Many | |
public class Teacher
{
public int Id { get; set; }
public required string FullName { get; set; }
public string? Email { get; set; }
public string? Phone { get; set; }
public DateTime HireDate { get; set; }
public bool IsActive { get; set; }
public required string NationalCode { get; set; }
public byte[] RowVersion { get; set; } = default!;
}
public void Configure(EntityTypeBuilder<Teacher> builder)
{
// تغییر نام جدول و اسکیمای آن
builder.ToTable("tbl_teachers", "hr");
// تعریف کلید اصلی با Identity (افزایشی خودکار)
builder.HasKey(t => t.Id);
builder.Property(t => t.Id)
.UseIdentityColumn() // ستون به صورت IDENTITY در SQL Server
.ValueGeneratedOnAdd();
// نام و نام خانوادگی (اجباری + حداکثر طول)
builder.Property(t => t.FullName)
.IsRequired()
.HasMaxLength(100)
.HasColumnType("nvarchar(100)");
// ایمیل (اختیاری + محدودیت طول)
builder.Property(t => t.Email)
.HasMaxLength(150)
.HasColumnType("nvarchar(150)");
// شماره تلفن (اختیاری + طول مشخص)
builder.Property(t => t.Phone)
.HasColumnType("nvarchar(11)");
// تاریخ استخدام (مقدار پیشفرض از SQL)
builder.Property(t => t.HireDate)
.HasColumnType("date")
.HasDefaultValueSql("GETDATE()");
// فعال بودن (مقدار پیشفرض false)
builder.Property(t => t.IsActive)
.HasDefaultValue(false);
// کد ملی (الزامی + یکتا)
builder.Property(t => t.NationalCode)
.IsRequired()
.HasMaxLength(10);
// ایندکس یکتا برای کد ملی
builder.HasIndex(t => t.NationalCode)
.IsUnique();
// تنظیم نسخه برای کنترل همزمانی
builder.Property(t => t.RowVersion)
.IsRowVersion();
}
IEntityTypeConfiguration یک اینترفیس از EF Core است که امکان میدهد پیکربندی هر مدل را در فایل جداگانه و تخصصی انجام دهیم. این الگو باعث میشود کلاس DbContext بسیار تمیزتر و قابل نگهداریتر شود و اصل مسئولیت یگانه (SRP) در معماری رعایت شود.
بهترین مسیر برای ساخت IEntityTypeConfiguration داخل فولدر Database Contex است. در پوشه Database Context یک پوشه جدید با نام Configurations ایجاد میکنیم. و داخل آن میتوانیم فایلهای Config خود را اضافه کنیم.
نام کانفیگ ها باید ترکیبی از ModelName + Configuration باشد. این ساختار اجباری نیست. ولی حرفه ای است.
public class UserProfileConfiguration : IEntityTypeConfiguration<UserProfile>
{
public void Configure(EntityTypeBuilder<UserProfile> builder)
{
//Config
}
}
حالا باید این پیکربندی را در OnModelCreating داخل DbContext رجیستر کنیم.
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
// اعمال پیکربندی با استفاده از کلاس جداگانه
modelBuilder.ApplyConfiguration(new UserProfileConfiguration());
}