برای راحتی و خوانا بودن کد ازش استفاده میکنیم #fluent

اون دو تا باکس قرمز ها جفشتون دارن یه کار میکنن و دومی مدل fluent هستش که ازش میخوایم استفاده کنیم

این قسمت هم داخل همین قسمت بالاییه

خوب حالا اصلا چرا این کار رو داریم میکنیم ؟

چون میتونیم اینطوری ازش استفاده کنیم #model_configurations #Entity_Configurations #Propery_Configuration

برای حالت اول :

خوب حالا برای این که کانفیگ ها رو در جای جداگونه بنویسیم میایم این کار رو میکنیم :

ممکنه در معماری های مختلف جای این متفاوت باشه لایه دامین و entity باید مستقل از هر چیزی باشند خوب دلیل این که این ها باید از entity جدا باشند اینه که اینجا اگر ما بخوایم entity هایی که داریم رو به یه دیتا بیس دیگه وصل کنیم، اگر این config ها کنار خوده entity باشه ، یعنی بهش وابسته باشه دیگه نمیتونیم به راحتی این کار رو انجام بدیم برای همین entity ها رو همیشه جدا مینویسیم و کانفیگ ها در DAL به صورت جداگانه مینویسیم

خوب حالا میایم اینطوری کافیگ ها رو جدا میسازیم

خوب اینجا این یعنی چی؟ IentityTypeConfiguration توی قسمت بعدیش میایم کانفیگ اون entity که میخوایم درست کنیم رو مینویسیم ، خوب وقتی که بزنیم اتوماتیک متد هاشو درست کنه بهمون void configure رو میده که اونجا همونطوری که میبینید اون پارامتر builder از نوع و تایپ entityTypeBuilder هستش که میشه همون شبیه model builder که توی دیتا بیس ازش استفاده کردیم

و بعد اینطوری میتونیم ازش استفاده کنیم :

اینجا اومدیم از همون دستوراتی که توی data annotation استفاده کردیم اینجا هم استفاده کردیم یعنی اومدیم گفتیم که اسم جدولی که این entity توی دیتابیس میسازی tbl_product هستش و بعد براش اسکیما prod رو هم تعیین کردیم

خوب حالا نکته ی آخر اینه که ما حالا اومدیم این کانفیگ رو انجام دادیم چجوری ببریم به برنامه بگیم که وقتی که میخوای دیتابیس رو بسازی بیا و از این کانفیگ استفاده کن ؟

اینطوری که توی شکل بالا گفته ، فقط دقت کنید که برای استفاده کردن ازش باید یادمون باشه که new بزنیم و از ApplyConfiguration استفاده کنیم و اون کلاسی که توش کانفیگ رو درست کردیم بدیم بهش

یه روش دیگه هم هست که اسمش reflection که بعدا یادش میگیریم

خوب ما میتونیم فیلد مورد نظرمون رو بیایم در دیتا بیس reqierd کنیم

خوب حالا میتونیم از onModelCreating هم استفاده کنیم ولی یکم متفاوته توی اونجا دیگه ما کانفیگی که میخوایم بنویسیم فقط برای یک entity نیستش . این یعنی این که توی عکس بالا میبینید که کافیگی که درست کردیم فقط برای product هستش ولی وقتی که توی OnModelCreating هستیم یعنی به کل دیتا بیس دسرتسی داریم و توی این حالت باید تعیین کنیم که به کدوم entity میخوایم وصل بشیم و اونجا اون پراپرتی که میخوایم رو reqired کنیم

خوب حالا کارهای دیگه ای که میتونیم انجام بدیم یکیش اینه که میتونیم یه پراپرتی که داریم توی یک entity و نمیخوایم توی دیتا بیس ذخیره بشه رو میتونیم تعیین کنیم با استفاده از ignore

خط بعدی که نوشته شده که از hasColumnName استفاده کرده برای اینه که زمانی که ما بخوایم اسم یه پراپرتی که میخوایم توی دیتا بیس ذخیره کنیم با اسم اون پراپرتی یکسان نباشه و اسمش رو بخوایم برای ذخیره در دیتا بیس تغییر بدیم ازش استفاده میکنیم:

دقت کنید که تمام این کارهای بالا رو میتونستیم با data annotation ها انجام بدیم مثلا برای این که پرارپتی ذخیره نشه میتونستیم از not mapped استفاده کنیم

با دستور بالا میتونیم تایپی که میخوایم رو تعیین کنیم

خوب یه چیزی که باید دقت کنیم اینه که ما هر کافیگی که بخوایم روی entity و دیتا بیسمون بخوایم اعمال کنیم باید از ApplyConfiguration استفاده کنیم

حالا ما یه entity دیگه هم ساختیم

میخوایم کد اصلی رو براش تعیین کنیم چون اسمش keyId هستش و Id نیست و اتوماتیک تشخیص داده نمیشه

خوب حالا فرض کنید که بخوایم دو تا کلید اصلی داشته باشیم

اینطوری مثل عکس بالا عمل میکنیم

خوب حالا اگر بخوایم اسم کلید اصلی رو تغییر بدیم اینطوری عمل میکنیم

خوب ما یه مفهومی داریم به اسم alternate key که میشه همون کاره کلید اصلی رو داره میکنه مثلا اینجا به طور مثال میشه از کد ملی استفاده کرد

خوب حالا میتونیم چند تا alternate key هم داشته باشیم / اینطوری:

دقت کنید که برای کد ملی indexable فعال هستش که نمایانگره اینه که به عنوان کلید alternate در نظر گرفته شده

حالا البته اینجا رو ببینید ما یه تغییراتی دادیم و حالا میخوایم توی دیتا بیس ببینیم که چجوری میشه :

خوب حالا ما برای این که بخوایم جست و جوی سریع تر و بهتر داشته باشیم میخوایم شماره تلفن رو هم ایندکس کنیم برای این کار میایم اینجوری کد میزنیم:

اینجوری هم میشه برای کد ملی و شماره تلفن این کار رو کرد

ما نمیتونیم یه entity رو که هیچ کلید اصلی براش در نظر نگرفتیم رو بریزیم توی دیتا بیس البته اینجا توی این پیام ارور داده و گفته که اگر میخواید این کار رو بکنید از has no key استفاده کنید

از ef core 2 به بعد این امکان اضافه شده

Evolution from EF6 to EF Core

  1. More Flexible Organization:

    • EF6: Primarily OnModelCreating or data annotations

    • EF Core: Added IEntityTypeConfiguration<T> for better separation

  2. Improved Fluent API:

    • More chainable methods for cleaner configuration

    • Better support for value converters

  3. Configuration Splitting:

    • EF Core allows splitting configuration across multiple files

    • Can apply configurations from assemblies automatically

  4. Global Query Filters:

    • New in EF Core (model-level configuration)

Best Practice Recommendations

  1. Use Model Configuration for:

    • Cross-entity relationships

    • Global query filters

    • Inheritance strategies

  2. Use Entity Configuration for:

    • Table-specific settings

    • Primary key configuration

    • Entity-specific indexes

  3. Use Property Configuration for:

    • Column-specific settings

    • Data type conversions

    • Validation constraints

  4. Prefer Fluent API when:

    • You need complex configurations

    • You want to keep entity classes clean

    • You need conditional logic in configuration

  5. Use Data Annotations when:

    • You have simple requirements

    • You want configuration visible on the property

    • You’re working with simple validation rules