اتكلمنا قبل كدا عن الموضوع دا في Migration

خلينا نوضح الخطوات اللي انت ذكرتها بخصوص الـ Migrations والـ DbContext في مشروعك:

Migrations

  1. إضافة Migration:
    • هعمل Run migration في البروجكت اللي فيه appsetting اللي فيه الـ Connection string اللي هو الـ API
    • مش محتاج تحدد الـ Output لو كنت محدده قبل كده في المشروع.
Add-Migration "OrderModule" -Context StoreContext 
// -O Data/Migrations
  1. التأكد من وجود Empty Constructor:

    • لازم يكون فيه Constructor فاضي لكل Entity عشان الـ Entity Framework يقدر يتعامل معاها بشكل صحيح. لو مش موجود، ممكن تواجه مشاكل أثناء الـ Migration.
  2. تأثير الـ Configurations:

    • حتى لو مش عامل DbSet في الـ StoreContext، الـ Configurations اللي عملتها باستخدام IEntityTypeConfiguration هتخلي الـ Entity Framework يفهم إن دي هتبقى Tables في الـ Database.
  3. حذف Migration:

    • لو عايز تمسح Migration، ممكن تستخدم Remove-Migration -Context StoreContext.
  4. إضافة DbSet:

    • من الأفضل تضيف DbSet لكل Entity في الـ StoreContext عشان اللي بيقرأ الكود يبقى عارف إيه الحاجات اللي عندك:
      public DbSet<Order> Orders {get; set;}
      public DbSet<OrderItem> OrderItems {get; set;}
      public DbSet<DeliveryMethod> DeliveryMethods {get; set;}

التعامل مع Foreign Key وCascade Delete

  • الـ Default للـ Foreign Key بيكون Cascade، يعني لو مسحت من الجدول الأساسي، هيمسح اللي مرتبط بيه في الجدول التاني.
  • لو عايز تخلي الـ Delivery Method لو اتمسحت يحطها ب Null بدل ما يمسحها، ممكن تستخدم:
builder.HasOne(O => O.DeliveryMethod)
  .WithMany()
  .OnDelete(DeleteBehavior.SetNull);
  • التعامل مع Nullable Foreign Key عندنا 3 حلول:
    1. تضيف الـ Foreign Key كـ Nullable في الكود:
public int? DeliveryMethodId {get; set;} // FK
  1. نضيف انها ممكن تبقا Nullable على الـ Navigational Property:
public DeliveryMethod? DeliveryMethod {get; set;}
  1. تعدلها في الـ Migration يدويًا:
DeliveryMethodId = table.Column<int?>(type: "int", nullable: true)
  • ولازم تعدلها في الـ Snapshot كمان:
b.Property<int?>("DeliveryMethodId")
 .HasColumnType("int");

تحديث الـ Database تلقائيًا

  • البرنامج بتاعي بيتعمل Run على السيرفر مرة واحدة اللي هي الـ Deploy
  • ممكن تخلي البرنامج يعمل Update-Database تلقائيًا عند بدء التشغيل.
  • ده مفيد لو مش هتقدر تعمل التحديثات يدويًا على السيرفر.
  • ممكن تضيف الكود ده في الـ Program عشان يتنفذ عند الـ Deploy.