کانال بله, جهت پشتیبانی و اطلاع رسانی کانال بله, جهت پشتیبانی و اطلاع رسانی
عضویت

آموزش Fluent API در Entity Framework Core

آموزش Fluent API در Entity Framework Core

آموزش Configuration ها در Entity Framework

Entity Framework Fluent API برای config کلاس های دامین استفاده می شود و براساس الگوی Fluent Interface است، که در آن نتیجه به صورت زنجیره ای از متدها (method chaining) شکل می گیرد.

در EF Core، کلاس ModelBuilder به عنوان یک Fluent API عمل می کند. با استفاده از آن می توان موارد زیادی رو کلاس ها config کرد و نسبت به annotation attribute ها آزادی عمل بیشتری داریم.

تنظیمات به وسیله این API روی سه جنبه مدل اعمال می شود:


  • Model Configuration: یک مدل EF برای mapping های دیتابیس config می کند. شمای پیش فرض، DB function ها، data annotation attribute و موجودیت های اضافه را طوری کانفیگ می کند که در mapping قرار نکیرند.
  • Entity Configuration: نگاشت موجودیت به جدول ها و روابط آن ها را config می کند، مثلا کلید اصلی، AlternateKey، ایندکس، نام جدول، روابط یک به یک، یک به چند و چند به چند و ...
  • Property Configuration: نگاشت property ها به ستون ها را config می کند. مثلا نام ستون، مقدار پیش فرض، nullable بودنشان، کلید خارجی، نوع داده، ستون concurrency و ...

جدول زیر متدهای مهم هر یک از این configuration ها را معرفی می کند:

Configuration
Fluent API متدهای
کاربرد
Model Configurations
HasDbFunction()
موقع کار با یک دیتابیس رابطه ای یک database function تعیین می کند.
HasDefaultSchema()
شمای دیتابیس را تعیین می کند.
HasAnnotation()
data annotation attribute ها را روی یک موجودیت اضافه یا تغییر می دهد.
HasSequence()
هنگام کار با دیتابیس رابطه ای، یک database sequence تعیین می کند.
Entity Configuration
HasAlternateKey()
یک alternate key در مدل EF برای آن موجودیت تعیین می کند.
HasIndex()
برای property های مشخص شده ایندکس تعیین می کند.
HasKey()
یک یا چند property را به عنوان کلید اصلی تعیین می کند.
HasMany()
بخش "چندی" رابطه را تعیین می کند، موجودیتی که یک collection property از نوع دیگر در سوی دیگر رابطه یک به چند یا چند به چند دارد.
HasOne()
بخش "یک" رابطه را تعیین می کند، موجودیتی که حاوی یک property از نوع موجودیت در سوی دیگر رابطه یک به یک یا یک به چند دارد.
Ignore()
تعیین می کند که یک کلاس یا property به جدول یا ستونی نگاشت نشود.
OwnsOne()
رابطه ای را تعیین می کند که در آن این موجودیت مالک یک موجودیت دیگر است. مقدار کلید موجودیت هدف از موجودیتی که دارنده آن است گرفته می شود.
ToTable()
جدولی را تعیین می کند که موجودیت به آن نگاشت می شود.
Property Configuration
HasColumnName()
نام ستون متناظر در دیتابیس را برای property تعیین می کند.
HasColumnType()
نوع داده ی ستون متناظر در دیتابیس برای یک property را تعیین می کند.
HasComputedColumnSql()
Property را ببه ستون محاسبه شده ای در دیتابیس رابطه ای نگاشت می کند.
HasDefaultValue()
مقدار پیش فرض را برای ستون متناظر property در دیتابیس رابطه ای تعیین می کند.
HasDefaultValueSql()
مقدار پیش فرض value expression را برای ستون متناظر property در دیتابیس رابطه ای تعیین می کند.
HasField()
فیلد را که با property استفاده می شود تعیین می کند.
HasMaxLength()
ماکسیمم طول دیتایی که در property ذخیره می شود را تعیین می کند.
IsConcurrencyToken()
Property را برای استفاده به صورت optimistic concurrency token تنظیم می کند.
IsRequired()
برای تعیین صحیح بودن مقدار null برای یک property بکار می رود.
IsRowVersion()
Property را تنظیم می کند که به عنوان optimistic concurrency detection استفاده شوذد.
IsUnicode()
تعیین می کند مقادیر string حاوی کارکترهای unicode باشند یا نه.
ValueGeneratedNever()
تعیین می کند property هنگام ذخیره شدهن مقدار تولید شده نداشته باشد.
ValueGeneratedOnAdd()
تعیین می کند یک property موقع ذخیره یک موجودیت جدید مقدار تولید شده داشته باشد.
ValueGeneratedOnAddOrUpdate()
تعیین می کند یک property موقع ذخیره شدن موجودیت جدید یا آپدیت موجودیت فعلی، مقدار تولید شده داشته باشد.
ValueGeneratedOnUpdate()
تعیین می کند یک property موقع ذخیره موجودیت فعلی مقدار تولید شده داشته باشد.

Fluent API Configurations

برای استفاده از این توابع، متد OnModelCreating را override کنید و از یک پارامتر ModelBuilder از نوع ModelBuilder برای تنظیم کلاس های دامین استفاده کنید.


public class SchoolDBContext: DbContext 
{
    public DbSet< Student > Students { get; set; }
        
    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        //Write Fluent API configurations here
        //Property Configurations
        modelBuilder.Entity< Student >()
                .Property(s => s.StudentId)
                .HasColumnName("Id")
                .HasDefaultValue(0)
                .IsRequired();
    }
}

در مثال بالا، ModelBuilder برای تنظیم property به صورت فراخوانی چند متد به دنبال هم استفاده شده و StudentId property در موجودیت Student را config کرده. نام ستون، مقدار پیش فرض، و الزام ورود مقدار را با IsRequired در یک دستور تعیین کرده است. دستور کاملا خوانا است و نوشتن آن زمان کمی می گیرد. کدهای زیر را مقایسه کنید:


//Fluent API method chained calls
modelBuilder.Entity< Student >()
        .Property(s => s.StudentId)
        .HasColumnName("Id")
        .HasDefaultValue(0)
        .IsRequired();
//Separate method calls
modelBuilder.Entity< Student >().Property(s => s.StudentId).HasColumnName("Id");
modelBuilder.Entity< Student >().Property(s => s.StudentId).HasDefaultValue(0);
modelBuilder.Entity< Student >().Property(s => s.StudentId).IsRequired();

توجه: تنظیماتی که با استفاده از Fluent API انجام می دهید اولویت بیشتری نسبت به data annotation attribute ها دارند.

در بخش بعد نحوه تعیین رابطه یک به چند را به کمک Fluent API آموزش می دهیم.

1398/06/22 5622 699
رمز عبور : tahlildadeh.com یا www.tahlildadeh.com
نظرات شما

نظرات خود را ثبت کنید...