Fluent API راهی برای پیکربندی کلاسها و روابط دامنه شما در Entity Framework Core (EF Core) با استفاده از یک نحو روان (روش زنجیرهای) است. این نرمافزار انعطافپذیری و کنترل بیشتری را در مقایسه با حاشیهنویسی دادهها فراهم میکند و به شما امکان میدهد تا نگاشتها و روابط پیچیده را پیکربندی کنید.

راه اندازی پروژه شما
- ایجاد یک پروژه جدید: ویژوال استودیو را باز کنید و یک پروژه جدید Console App (.NET Core) ایجاد کنید.
- بسته های EF Core را نصب کنید: روی پروژه خود کلیک راست کنید، "Manage NuGet Packages" را انتخاب کنید و Microsoft.EntityFrameworkCore و Microsoft.EntityFrameworkCore.SqlServer را نصب کنید.
تعریف مدل
کلاس های موجودیت و کلاس DbContext خود را تعریف کنید. در اینجا یک مثال است:
using Microsoft.EntityFrameworkCore; using System.Collections.Generic; public class BloggingContext : DbContext { public DbSet<Blog> Blogs { get; set; } public DbSet<Post> Posts { get; set; } protected override void OnConfiguring(DbContextOptionsBuilder options) => options.UseSqlServer("Server=(localdb)\\mssqllocaldb;Database=Blogging;Trusted_Connection=True;"); } public class Blog { public int BlogId { get; set; } public string Url { get; set; } public List<Post> Posts { get; } = new List<Post>(); } public class Post { public int PostId { get; set; } public string Title { get; set; } public string Content { get; set; } public int BlogId { get; set; } public Blog Blog { get; set; } }
پیکربندی Fluent API
متد OnModelCreating را در کلاس DbContext خود Override کنید تا مدل خود را با استفاده از Fluent API پیکربندی کنید. در اینجا یک مثال است:
protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<Blog>() .ToTable("Blogs") .HasKey(b => b.BlogId); modelBuilder.Entity<Post>() .ToTable("Posts") .HasKey(p => p.PostId) .HasOne(p => p.Blog) .WithMany(b => b.Posts) .HasForeignKey(p => p.BlogId); }
توضیح تنظیمات Fluent API
- ToTable: نام جدول را برای موجودیت مشخص می کند.
- HasKey: کلید اصلی را برای موجودیت تعریف می کند.
- HasOne: یک رابطه یک به یک یا یک به چند را پیکربندی می کند.
- WithMany: بخش چند از یک رابطه یک به چند را پیکربندی می کند.
- HasForeignKey: ویژگی کلید خارجی را برای رابطه مشخص می کند.
اجرای برنامه
1. ساخت پروژه: به «Build» > «Build Solution» بروید یا Ctrl + Shift + B را فشار دهید.
2. اجرای برنامه: F5 را فشار دهید یا روی دکمه "شروع" کلیک کنید تا برنامه شما اجرا شود.
تایید پایگاه داده
- باز کردن SQL Server Management Studio (SSMS): اس کیو ال سرور را راه اندازی کنید و به پایگاه داده خود متصل شوید.
- جداول را بررسی کنید: بررسی کنید که جداول وبلاگ ها و پست ها با طرح درست ایجاد شده اند.
تنظیمات پیشرفته Fluent API
1. پیکربندی روابط
رابطه یک به یک:
modelBuilder.Entity<Blog>() .HasOne(b => b.BlogImage) .WithOne(i => i.Blog) .HasForeignKey<BlogImage>(b => b.BlogId);
رابطه چند به چند (EF Core 5.0+):
modelBuilder.Entity<AuthorBook>() .HasKey(ab => new { ab.AuthorId, ab.BookId }); modelBuilder.Entity<AuthorBook>() .HasOne(ab => ab.Author) .WithMany(a => a.AuthorBooks) .HasForeignKey(ab => ab.AuthorId); modelBuilder.Entity<AuthorBook>() .HasOne(ab => ab.Book) .WithMany(b => b.AuthorBooks) .HasForeignKey(ab => ab.BookId);
2. پیکربندی کلیدهای ترکیبی
modelBuilder.Entity<Post>() .HasKey(p => new { p.PostId, p.BlogId });
3. پیکربندی محدودیت های ویژگی
طول مورد نیاز و حداکثر:
modelBuilder.Entity<Blog>() .Property(b => b.Url) .IsRequired() .HasMaxLength(500);
تبدیل ارزش:
modelBuilder.Entity<Blog>() .Property(b => b.Status) .HasConversion( v => v.ToString(), v => (BlogStatus)Enum.Parse(typeof(BlogStatus), v));
4. پیکربندی شاخص ها
modelBuilder.Entity<Blog>() .HasIndex(b => b.Url) .IsUnique();
5. پیکربندی مقادیر پیش فرض
modelBuilder.Entity<Post>() .Property(p => p.PublishedDate) .HasDefaultValueSql("GETDATE()");
استفاده از Fluent API برای پیکربندی نوع Entity
برای تمیز نگه داشتن و نگهداری روش OnModelCreating، می توانید از کلاس های پیکربندی جداگانه ای استفاده کنید که رابط IEntityTypeConfiguration<T> را پیاده سازی می کنند.
public class BlogConfiguration : IEntityTypeConfiguration<Blog> { public void Configure(EntityTypeBuilder<Blog> builder) { builder.ToTable("Blogs") .HasKey(b => b.BlogId); builder.Property(b => b.Url) .IsRequired() .HasMaxLength(500); builder.HasOne(b => b.BlogImage) .WithOne(i => i.Blog) .HasForeignKey<BlogImage>(b => b.BlogId); } } public class BloggingContext : DbContext { public DbSet<Blog> Blogs { get; set; } public DbSet<Post> Posts { get; set; } protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.ApplyConfiguration(new BlogConfiguration()); } protected override void OnConfiguring(DbContextOptionsBuilder options) => options.UseSqlServer("Server=(localdb)\\mssqllocaldb;Database=Blogging;Trusted_Connection=True;"); }
ویژگی های Fluent API اضافی
1. ویژگی های سایه:
اینها ویژگی هایی هستند که در مدل EF Core وجود دارند اما در کلاس موجودیت وجود ندارند.
modelBuilder.Entity<Post>() .Property<DateTime>("LastUpdated");
2. فیلترهای درخواست سراسری:
فیلتری را تعریف کنید که به طور خودکار برای همه پرس و جوها برای یک نوع موجودیت خاص اعمال شود.
modelBuilder.Entity<Blog>() .HasQueryFilter(b => !b.IsDeleted);
3. انواع موجودیت:
Owned Types: انواعی را تعریف کنید که دارای جدول مشابهی با مالک خود هستند.
modelBuilder.Entity<Blog>() .OwnsOne(b => b.BlogDetails);
تقسیم جدول: چندین نوع موجودیت را برای نگاشت به یک جدول پیکربندی کنید.
modelBuilder.Entity<Blog>() .HasOne(b => b.BlogDetails) .WithOne() .HasForeignKey<BlogDetails>(d => d.BlogId); modelBuilder.Entity<BlogDetails>() .ToTable("Blogs") .HasKey(d => d.BlogId);
تقسیم جدول یک ویژگی در EF Core است که به انواع موجودیت اجازه می دهد تا به یک جدول پایگاه داده نگاشت شوند. این می تواند برای سازماندهی داده های مرتبط در یک جدول مفید باشد و در عین حال کلاس های موجودیت مجزا را در کد شما حفظ کند. برای مثال، اگر کلاسهای Blog و BlogDetails دارید، هر دو را میتوان در یک جدول Blogs ذخیره کرد اما بهعنوان موجودیتهای جداگانه در برنامهتان مدیریت کرد.
کلاس مثال بالا در ادامه پیاده سازی می شود:
public class Blog { public int BlogId { get; set; } public string Url { get; set; } public BlogDetails BlogDetails { get; set; } } public class BlogDetails { public int BlogId { get; set; } public string Description { get; set; } public DateTime CreatedDate { get; set; } }