پرشین تم مقالات آموزش Fluent API در EF Core

آموزش Fluent API در EF Core

image profile پرشین تم - 13 دی 1403 - 08:02 دانلود مقاله

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

آموزش Fluent API در 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; }
}
با خرید اشتراک می توانید تا چندین برابر مبلغ خرید اشتراک خود قالب های HTML ، سورس کدهای آماده و یا مقالات دانلود کنید
شما می توانید تنها فقط با مبلغ 3,000,000 میلیون تومان وب سایت سفارسی برای خود داشته باشید
محبوب ترین مقالات
تفاوت بین CSS و SCSS چیست؟ تفاوت بین CSS و SCSS چیست؟
category برنامه نویسی 07 اسفند 1402
تفاوت بین RDBMS و DBMS تفاوت بین RDBMS و DBMS
category برنامه نویسی 02 فروردین 1403
کاوش در معماری GPT-3 کاوش در معماری GPT-3
category هوش مصنوعی 12 اسفند 1402
کلمات کلیدی در SQL کلمات کلیدی در SQL
category برنامه نویسی 01 خرداد 1403
تفاوت بین CSS، SASS و SCSS چیست؟ تفاوت بین CSS، SASS و SCSS چیست؟
category برنامه نویسی 13 اسفند 1402
ChatGPT چیست؟ ChatGPT چیست؟
category هوش مصنوعی 12 اسفند 1402
انواع Join در SQL انواع Join در SQL
category برنامه نویسی 02 فروردین 1403
آخرین مقالات
آموزش کامل و جامع Git آموزش کامل و جامع Git Git یک سیستم کنترل نسخه قدرتمند که برای مدیریت و ردیابی تغییرات در کد شما ضروری است. ما در این آموزش اصول اولیه را پوش...
category برنامه نویسی 21 دی 1403
React چیست؟ آشنایی با اصول و تاریخچه React React چیست؟ آشنایی با اصول و تاریخچه React React که با نام‌های React.js یا ReactJS نیز شناخته می‌شود، یک کتابخانه جاوا اسکریپت برای ساخت رابط‌های کاربری است که ت...
category برنامه نویسی 19 دی 1403
معرفی React و سرفصل های دوره آموزش React معرفی React و سرفصل های دوره آموزش React React یک کتابخانه محبوب جاوا اسکریپت است که برای ساخت رابط های کاربری، به ویژه برنامه های تک صفحه ای استفاده می شود. ا...
category برنامه نویسی 19 دی 1403